Com base em Resposta de Mick e Phoshi Eu encontrei a solução que estava procurando. Eu criei um script AutoIt que percorre todos os PATHEXT's e PATHs para encontrar o primeiro local onde o parâmetro passado está localizado. Ele lida com parâmetros sem extensão e com extensão total. Ele procura primeiro o diretório de trabalho local e, em seguida, as variáveis de ambiente. No que diz respeito a tudo o que li, é assim que o Windows executa a procura pelo comando também. Aqui está o script:
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
Para fazê-lo funcionar, você precisa executá-lo através do programa Aut2exe.exe que vem com o AutoIt (atalho é Compile Script to .exe
) e verifique o "Console?" caixa de seleção ao compilá-lo. Eu apenas compilo para um arquivo chamado "which.exe" que eu coloco em um diretório de caminho existente (como C:\Windows\System32
).