Узнайте, какое приложение запущено при запуске из командной строки Windows
Из-за количества каталогов, которые вы можете поместить в переменную среды%PATH%, очень легко иметь непреднамеренные конфликты между именами приложений. Я поклялся, что встречал этот совет раньше, но я не могу найти его где-нибудь. Есть ли способ в командной строке увидеть каталог, в котором находится приложение? Например, я ищу что-то вроде следующего:
C:\> xcopy
Invalid number of parameters
0 File(s) copied
C:\> **SOME_COMMAND** xcopy
C:\Windows\System32\xcopy.exe
5 ответов
Немного тяжелый, но если вам нравится командная строка в Windows, вы должны попробовать Cygwin. Поместите его в папку \bin на PATH, и у вас будет целый набор отличных инструментов, не в последнюю очередь which
, который говорит вам точно, какой файл вы будете выполнять:)
(И да, я понимаю иронию добавления в свой PATH, чтобы помочь с тем, что там слишком много)
редактировать: это также может быть уместно.
Where.exe - это Windows-эквивалент whereis в unix. Если вы используете Windows Server 2003+ или Vista+, этот инструмент устанавливается в%windir%/System32. Использование "где" в командной оболочке (cmd.exe) показывает результаты в порядке поиска путей:
C:\> where where
C:\Windows\System32\where.exe
Помните, что PowerShell обычно использует псевдоним "где" для Where-Object, поэтому вам просто нужно включить ".exe" при вызове куда из PowerShell:
C:\> where.exe where
C:\Windows\System32\where.exe
Также см. Windows эквивалент Где?
Вот простой файл ванны, который будет делать то, что вы хотите.
@for %%e in (%PATHEXT%) do @for %%i in (%1%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i
whereis xcopy - работает whereis xcopy.exe - не будет работать
Надеюсь, это поможет (несколько)
С уважением
Основываясь на ответах Мика и Фоши, я нашел решение, которое искал. Я создал скрипт 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
).
Инструменты UNIX GNU доступны в портах Windows, вам не нужно проходить через сценарии, как описано выше. Команда which работает при наличии xcopy или xcopy.exe или других исполняемых файлов, включая BAT-файлы. Их можно скачать с:
http://gnuwin32.sourceforge.net/packages.html
Они очень удобны.