找到可执行文件的路径并将可执行文件存储在变量中



我正在尝试创建一个批处理文件: 批处理文件将首先找到可执行文件的路径。然后,路径将存储在变量中供以后使用。

这是我的代码:

@echo off
setlocal
set directoryName=dir/s c:ABCD.exe
rem run command
cmd /c %directoryName%
pause 
endlocal

命令提示符确实向我返回可执行文件的路径,但路径未存储在变量中。为什么会这样?

阅读您的问题,您似乎根本不想保存可执行文件的路径,但文件名及其完整路径

:对于这种类型的搜索,我更喜欢Where命令,此示例搜索当前目录所在的驱动器:

@Echo Off
Set "mPth="
For /F "Delims=" %%A In ('Where /R  "ABCD.exe" /F 2^>Nul'
) Do Set "mPth=%%A"
If Not Defined mPth Exit /B
Rem Rest of code goes here

变量%mPth%应包含所需的内容。我将其设计为自动将变量值括在双引号中,如果您不希望使用双引号,请将在线4%%A更改为%%~A。如果未找到该文件,则脚本将仅Exit,如果您希望它执行其他操作,则可以在线添加该功能5

注意:代码可以找到多个匹配项,如果找到,则会将变量值保存到最后一个匹配项,这可能不是您想要的匹配项。对于这种可能性,可能希望包含强大的解决方案。

编辑(这会将变量设置为仅可执行文件的路径%mPth%)

@Echo Off
Set "mPth="
For /F "Delims=" %%A In ('Where /R  "ABCD.exe" /F 2^>Nul'
) Do Set "mPth=%%~dpA"
If Not Defined mPth Exit /B
Set "mPth=%mPth:~,-1%"
Rem Rest of code goes here

让我们演练一下您的代码

set directoryName=dir/s c:ABCD.exe

这会用值dir/s c:ABCD.exe填充变量directory名称。

cmd /c %directoryName%

这将在directoryname中执行命令。代码中没有将文件位置保存到变量的行。


提取文件的路径可以按如下方式完成

@echo off
setlocal
set executable=c:locationABCD.exe
FOR %%A IN ("%executable%") DO Set executablepath=%%~dpA
echo executablepath: %executablepath%
pause 
endlocal

%executablepath%将包含c:location

分配给directoryname的值是dir /s c:abc.exe

然后,此值将替换为cmd行中的%directoryname%,该行执行命令dir/s...,以熟悉的dir格式显示abc.exe的位置。

如果你想要的只是directoryname中的目录名,那么你需要

for /f "delims=" %%a in ('dir /s /B /a-d "c:abc.exe"') do set "directoryname=%%~dpa"

它将首先执行dir命令,然后处理该命令的每一行输出并将其完整分配给%%a

显示的dir命令将以基本形式(/b)"显示"在指定目录(c:)及其子目录(/s)中找到的匹配名称 - 即仅名称,没有大小或日期或报告标题或报告页脚,a-d没有目录名(如果它们与"掩码"abc.exe匹配

)for /f命令的delims=选项指示将命令输出的整行(单引号)分配给%%a

当结果被分配给变量directoryname时,只有D铆和Path部分被选中,方法是使用~dp前缀a

请注意,只有找到的姓氏才会分配给变量,因为任何先前的赋值都将被后续赋值覆盖。

这可能是也可能不是您要找的。此脚本搜索PATH变量,并查找在PATHEXT变量列表中具有和扩展名的文件。

@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@SET EXITCODE=1
:: Needs an argument.
@IF "x%1"=="x" (
@ECHO Usage: %0 ^<progName^>
GOTO TheEnd
)
@set newline=^

@REM Previous two (2) blank lines are required. Do not change!
@REM Ensure that the current working directory is first
@REM because that is where DOS looks first.
@PATH=.;!PATH!
@FOR /F "tokens=*" %%i in ("%PATH:;=!newline!%") DO @(
@IF EXIST %%i%1 (
@ECHO %%i%1
@SET EXITCODE=0
)
@FOR /F "tokens=*" %%x in ("%PATHEXT:;=!newline!%") DO @(
@IF EXIST %%i%1%%x (
@ECHO %%i%1%%x
@SET EXITCODE=0
)
)
)
:TheEnd
@EXIT /B %EXITCODE%

请注意,这可能会找到多个可执行文件。它还可能找到多种类型的可执行文件。当前目录也首先包含在内,因为这是 shellcmd.exe所做的。

M:>whence wc
.wc.BAT
.wc.VBS
C:Userslitbinwc.BAT
C:Userslitbinwc.VBS

相关内容

最新更新