Scripting 如何扩展此批处理命令?

Scripting 如何扩展此批处理命令?,scripting,batch-file,Scripting,Batch File,我偶然发现了这段批处理代码。如果您输入每个.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 但它有点有限,因为它找不到其他可

我偶然发现了这段批处理代码。如果您输入每个
.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


但它有点有限,因为它找不到其他可执行文件。我已经做了一些批处理,但我不知道如何编辑此代码,使其能够对硬盘进行爬网并返回准确路径。

当您想在硬盘上的任何位置(而不仅仅是路径)查找可执行文件(或其他文件)时,可能只有以下内容可以可靠地工作:

dir /s /b \*%!~x1 | findstr "%1"
但是,它仍然非常慢。而且它不适用于循环目录结构。而且它可能吃孩子


使用Windows Search(取决于操作系统)或从头开始编写一个完全符合您要求的程序(循环目录的事情可能很容易在最新的Windows版本上发生,因为默认情况下他们已经有了循环目录)。

以下是用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"])

为什么要成批完成?因为这是可能的……成批编写这类东西很难、速度慢、不可移植、耗时。我猜像Java或C#这样的面向对象语言已经内置了文件定位函数?它们可能会。我不确定。但是,您可以在java.io或System.io中浏览。也许你会发现一些东西,但通常的方法是“到处看看,并与你搜索的内容进行比较。对于Powershell,这将如下所示: