У меня два файла: abc.exe и abc.cmd - оба где-то по пути. abc.exe - это утилита командной строки. abc.cmd - это оболочка для abc.exe.
Когда я набираю «abc» в командной строке, как я могу определить, какой файл запускается, и полный путь к нему? Я пробовал использовать такие утилиты, как where и which, но оба требуют, чтобы вы вводили расширение, чтобы сообщить вам, откуда запускается файл.
Я тоже не сплю достаточно долго, чтобы открыть проводник процессов и выяснить это.
Ты пробовала Монитор процесса? Вы можете установить фильтр на «путь содержит 'abc'», а затем просмотреть результаты.
Командные файлы CMD довольно слабы в этом, но если вы не против перейти на Perl.
$filename=shift() or die ("Enter a filename\n");
@extensions = split(/\;/,$ENV{PATHEXT});
@paths = (".",split(/\;/,$ENV{PATH}));
foreach $path (@paths) {
$path =~ s/\\?\s*$/\\/;
foreach $ext (@extensions) {
if (-e $path.$filename.$ext) {
print $path.$filename.$ext."\n";
}
}
}
Учитывая имя файла без расширения, он будет перечислять порядок, в котором будут найдены различные типы исполняемых файлов (как определено переменной PATHEXT), начиная с текущего каталога, а затем последовательно ища PATH для всех типов исполняемых файлов в правильном порядке. Этот шаблон поиска используется оболочкой CMD, насколько мне известно, для команд, запускаемых вызовами api, такими как CreateProcess, поведение и порядок поиска будут другими.
Это быстро и грязно, и я не тестировал его исчерпывающе, но он обрабатывает пути с пробелами и пути с \ без обратной косой черты в конце, что является наиболее очевидными сложностями. Нечетные пути с косой чертой и точкой с запятой в кавычках вызовут цикл.
Просто введите команду ECHO в файл cmd, и вы все узнаете достаточно быстро. Возможно, это не то, что вы хотите в долгосрочной перспективе, но для этой цели подойдет.
Вы можете попробовать выполнить cmd / K abc, и он запустится, но командная строка останется открытой. Надеюсь это поможет.
Из более ранних воспоминаний (обновлено на Microsoft KB35284) порядок выполнения будет EXE, а затем CMD (или BAT в прежние времена). Так, если вы пропустите расширение и оба находятся в локальной папке, в EXE
будет иметь приоритет и выполнить.
Интересно то, что если вы использовали вкладку - разверните CMD
(или BAT
) также будет расширен (coz, в котором используется алфавитный порядок).
Если вас заинтересует CMD
и BAT
поиск различий в файлах Windows-пакетные файлы-летучая мышь-против-cmd
Вот небольшой инструмент, который я написал, который скажет вам, где первое появление файла на вашем пути. Чтобы точно узнать, что работает в вашей системе, используйте ProcessExplorer из sysinternals.
пример: где летучая мышь
@echo off
setlocal
if "%1"=="" goto USAGE
set filename=%1
for %%i in (%filename%) do @echo %%~dp$PATH:i%%i
goto EOF
:USAGE
echo %0 filename
:EOF
endlocal
В Windows Vista есть программа под названием where.exe
. Вы можете использовать его как where abc
. Он покажет полный путь к abc
.