我想检索一个文件名并将其分配给一个变量,以便可以在脚本中进一步使用它。
set directoryName = dir Docum?nt*
echo %directoryName%
但是一旦我执行批处理文件,我得到的就是这个。
D:\ >a.bat
D:\ >set directoryName = dir Docum?nt*
D:\ >echo
ECHO is on.
我如何确保我的变量已被分配值,即目录名称,以便我可以开始编写进一步的脚本。
我的a.bat
包含:
set directoryName=dir Docum?nt*
echo %directoryName%
删除空格后:
D:\Workspace>set directoryName=dir Docum?nt*
D:\Workspace>echo dir Docum?nt*
dir Docum?nt*
我猜,vairbale 已被分配了整个值以及命令关键字,而不是结果。我预计输出是目录名称,即Documentation
答案1
变量设置的等号前后有空格,只需将其删除并使用下面的方法即可。
@ECHO ON
set directoryName=dir Docum?nt*
echo %directoryName%
错误的
set directoryName = dir Docum?nt*
正确的
隐式 FOR 循环
FOR /F "TOKENS=*" %%F IN ('DIR /B /AD "Docum?nt*"') DO SET directoryName=%%~F
递归 FOR 循环
FOR /F "TOKENS=*" %%F IN ('DIR /B /AD /S "Docum?nt*"') DO SET directoryName=%%~F
更多资源
答案2
如果您想要设置匹配的目录名Docum?nt*
,那么您需要的是:
for /d %%d in (Docum?nt*) do set directoryName="%%d"
如果多个目录与掩码匹配,则您只会得到其中一个匹配项。如果您需要变量来保存匹配目录的列表,则需要使用for /f
。
答案3
没有空间。
如果必须在名称中使用空格,请采用以下格式:
set directoryName = "dir Docum?nt*"
要么“”或者没有空间。
答案4
我希望输出是目录名称,即Documentation
除非Documentation
你跑步您已存储在变量中的命令。
使用以下批处理文件(test.cmd):
@echo off
setlocal
set directoryName=dir Docum?nt*
rem run command
cmd /c %directoryName%
pause
endlocal
示例输出:
> test
dir Docum?nt*
Volume in drive F is Expansion
Volume Serial Number is 3656-BB63
Directory of F:\test
09/03/2017 17:10 <DIR> Documentation
0 File(s) 0 bytes
1 Dir(s) 1,701,065,842,688 bytes free
进一步阅读
- Windows CMD 命令行的 AZ 索引- 适合所有人的绝佳参考
- 命令- 启动一个新的 CMD shell 并(可选)运行命令/可执行程序。
- 目录- 显示文件和子文件夹的列表。
- 放- 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。