Назад | Перейти на главную страницу

Как мне определить, какой файл выполняется?

У меня два файла: 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.