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

时间:2018-03-28 05:48:48

标签: batch-file cmd

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

这是我的代码:

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

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

4 个答案:

答案 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
相关问题