Основываясь на ответах Мика и Фоши, я нашел решение, которое искал. Я создал скрипт AutoIt, который перебирает все PATHEXT и PATH, чтобы найти первое место, где находится передаваемый параметр. Он обрабатывает как параметры расширения, так и расширения. Сначала он ищет локальный рабочий каталог, а затем переменные среды. Что касается всего, что я прочитал, это то, как Windows выполняет поиск и для этой команды. Вот сценарий:
If $CmdLine[0] > 0 Then
$commandToFind = $CmdLine[1]
$matchFound = false
$foundPath = ""
$pathEnvironmentVariable = EnvGet("PATH")
$pathDirectories = StringSplit($pathEnvironmentVariable, ";", 2)
$pathExtensionsEnvironmentVariable = EnvGet("PATHEXT")
$pathExtensions = StringSplit($pathExtensionsEnvironmentVariable, ";", 2)
; Search the local directory first for the file
If FileExists($commandToFind) Then
$matchFound = true
$foundPath = @WorkingDir & "\" & $commandToFind
EndIf
For $pathExtension In $pathExtensions
$fullPath = @WorkingDir & "\" & $commandToFind & StringLower($pathExtension)
If FileExists($fullPath) Then
$matchFound = true
$foundPath = $fullPath
ExitLoop
EndIF
Next
If Not $matchFound == true Then
; Loop through all the individual directories located in the PATH environment variable
For $pathDirectory In $pathDirectories
If FileExists($pathDirectory) Then
$pathWithoutExtension = $pathDirectory & "\" & $commandToFind
; Check if the command exists in the current path. Most likely the parameter had the extension passed in
If FileExists($pathWithoutExtension) Then
$matchFound = true
$foundPath = $pathWithoutExtension
ExitLoop
EndIf
If Not $matchFound == true Then
; Loop through all possible system extensions to see if the file exists.
For $pathExtension In $pathExtensions
$fullPath = $pathWithoutExtension & StringLower($pathExtension)
If FileExists($fullPath) Then
$matchFound = true
$foundPath = $fullPath
ExitLoop
EndIf
Next
EndIf
If $matchFound == true Then
ExitLoop
EndIf
EndIf
Next
EndIf
If $matchFound == true Then
ConsoleWrite("Located at " & $foundPath & @CRLF)
Else
ConsoleWriteError("Unable to locate the command" & @CRLF)
EndIf
EndIf
Чтобы заставить его работать, вам нужно запустить его через программу Aut2exe.exe, которая поставляется с AutoIt (ярлык называется Compile Script to .exe
) и проверить «Консоль?"флажок при его компиляции. Я просто компилирую его в файл с именем «which.exe», который я добавляю в существующий каталог путей (например, C:\Windows\System32
).