Как расширить эту пакетную команду? - PullRequest
0 голосов
/ 22 марта 2009

Я наткнулся на этот кусок кода партии. Он должен найти путь к каждому файлу .exe, если вы его введете.

@Set Which=%~$PATH:1
@if "%Which%"=="" ( echo %1 not found in path ) else ( echo %Which% )

Например, если вы сохраните этот код в файле which.bat, а затем перейдете в его каталог в DOS, вы можете написать

which notepad.exe

Результат будет: C:\WINDOWS\System32\notepad.exe

Но он немного ограничен в том, что не может найти другие исполняемые файлы. Я сделал немного, но я не понимаю, как я могу отредактировать этот код, чтобы он мог сканировать жесткий диск и возвращать точный путь.

Ответы [ 2 ]

2 голосов
/ 22 марта 2009

Если вы хотите найти исполняемый файл (или другой файл) где-нибудь на диске, а не только в PATH, тогда, возможно, только следующее будет надежно работать:

dir /s /b \*%!~x1 | findstr "%1"

Но все же, это ужасно медленно. И это не работает с циклическими структурами каталогов. И это, вероятно, ест детей.

Возможно, вам будет гораздо лучше использовать Windows Search (зависит от ОС) или писать программу с нуля, которая будет делать именно то, что вам нужно (циклическая директория может произойти в последних версиях Windows довольно легко; по умолчанию).

0 голосов
/ 22 марта 2009

Вот то же самое, написанное на python:


import os

def which(program,additional_dirs=[]):
    path = os.environ["PATH"]
    path_components = path.split(":")
    path_components.extend(additional_dirs)
    for item in path_components:
        location = os.path.join(item,program)
        if os.path.exists(location):
            return location
    return None

Если вызывается только с аргументом, он будет искать только путь. Если вызывается с двумя аргументами (вторым является массив), будут искать другие каталоги. Вот некоторые фрагменты:


# this will search notepad.exe in the PATH variable
print which("notepad.exe")
# this will search whatever.exe in PATH. If not found there,
# it will continue searching in the D:\ drive and in the Program Files
print which("whatever.exe",["D:/","C:/Program Files"])
...