我正在尝试创建批处理文件: 批处理文件将首先找到可执行文件的路径。然后,路径将存储在变量中供以后使用。
这是我的代码:
@echo off
setlocal
set directoryName=dir/s c:\ABCD.exe
rem run command
cmd /c %directoryName%
pause
endlocal
命令提示符确实返回了可执行文件的路径,但路径未存储在变量中。为什么会这样?
答案 0 :(得分:0)
让我们一起浏览您的代码
set directoryName=dir/s c:\ABCD.exe
这会使用值directory
填充变量dir/s c:\ABCD.exe
名称。
cmd /c %directoryName%
执行directoryname
中的命令。代码中没有行将文件位置保存到变量。
提取文件的路径可以按如下方式完成
@echo off
setlocal
set executable=c:\location\ABCD.exe
FOR %%A IN ("%executable%") DO Set executablepath=%%~dpA
echo executablepath: %executablepath%
pause
endlocal
%executablepath%
将包含c:\location\
答案 1 :(得分:0)
您分配给directoryname
的值为dir /s c:\abc.exe
。
然后将此值替换为%directoryname%
行中的cmd
,执行命令dir/s...
,显示abc.exe
的位置1}}采用熟悉的dir
格式。
如果您想要的只是directoryname
中的目录名,那么您需要
for /f "delims=" %%a in ('dir /s /B /a-d "c:\abc.exe"') do set "directoryname=%%~dpa"
首先执行dir
命令,然后处理该命令的每一行输出并将其全部分配给%%a
。
显示的dir
命令将显示"显示"在基本形式(c:\
)中在指定目录(/s
)及其子目录(/b
)中找到的匹配名称 - 即仅名称,没有大小或日期或报告标题或报告页脚,以及a-d
没有目录名(如果它们与"掩码" abc.exe
匹配)
delims=
命令的for /f
选项指示由单引号命令输出的整行作为%%a
。
将结果分配给变量directoryname
时,只使用~dp
前缀选择 D rive和 P ath部分a
。
请注意,只有最后找到的名字才会被分配给变量,因为任何先前的作业都会被后续作业覆盖。
答案 2 :(得分:0)
阅读你的问题,你似乎根本不想保存可执行文件的路径,但是文件名完整了它的完整路径:
我更喜欢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%
应该包含您需要的内容。我已将其设计为自动将变量值括在双引号中,如果您不希望这样,请将%%A
更改为4
到%%~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
答案 3 :(得分:0)
这可能是也可能不是你想要的。此脚本搜索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%
请注意,这可能会找到多个可执行文件。它还可以找到多种类型的可执行文件。当前目录也包括在内,因为它是shell cmd.exe
的作用。
M:>whence wc
.\wc.BAT
.\wc.VBS
C:\Users\lit\bin\wc.BAT
C:\Users\lit\bin\wc.VBS