答案关于为什么在命令行上使用“set var = text”后没有带有“echo %var%”的字符串输出? https://stackoverflow.com/a/26388460/3074564命令行有什么问题:
set origDir= %cd%
命令不会忽略等号后面的空格SET。环境变量的字符串值origDir
因此用前导空格字符定义。
接下来是命令行
set temporaryFile="!origDir!\temp.txt"
结果是你的情况的字符串" D:\my work\temp.txt"
将双引号分配给环境变量temporaryFile
.
因此,由于以空格字符开头,路径用双引号引起来的文件名无效。
您的任务的可能代码是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "origDir=%CD%"
rem Current directory path usually does not end with a backslash. But on
rem current directory being root of a drive it ends with a backslash which
rem should be removed to correct concatenate it with backslash and file name.
if "%origDir:~-1%" == "\" set "origDir=%origDir:~0,-1%"
set "temporaryFile=%origDir%\temp.txt"
cd /D C:\
dir /A-D /B /S >"%temporaryFile%"
endlocal
这里不需要使用延迟环境变量扩展。
命令CD仅当参数为当前目录时,才将当前目录更改为与当前驱动器不同的驱动器上的指定目录/D
也使用了并且指定的目录不在使用 UNC 路径引用的网络共享上。
命令PUSHD启用命令扩展也适用于 UNC 路径并且POPD可以恢复初始当前目录。
嗯,命令ENDLOCAL在上面的批处理文件中也恢复初始当前目录。从命令提示符窗口中运行此批处理文件可以看到这一点D:\my work
是当前目录。echo %CD%
运行批处理文件输出后执行D:\my work
尽管批处理文件更改为驱动器的根目录C:
. Read 这个答案 https://stackoverflow.com/a/38676582/3074564有关命令的详细信息SETLOCAL and ENDLOCAL.
也可以但不推荐:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "origDir=%CD%"
if "%origDir:~-1%" == "\" set "origDir=%origDir:~0,-1%"
set "temporaryFile="%origDir%\temp.txt""
cd /D C:\
dir /A-D /B /S >%temporaryFile%
endlocal
环境变量temporaryFile
保存的文件名的完整路径已经用双引号引起来,因此DIR命令行由 Windows 命令解释器预处理后执行,如下所示:
dir /A-D /B /S 1>"D:\my work\temp.txt"
一般来说,不建议将已经用双引号括起来的文件夹或文件名分配给环境变量,因为如果稍后在批处理代码中将变量值与其他字符串连接起来,这很容易导致意外行为,请参见示例如何设置带空格的环境变量? https://stackoverflow.com/questions/34353504/how-to-set-environment-variables-with-spaces
但此任务的最短版本是单个命令行:
@dir C:\* /A-D /B /S >temp.txt
该单个命令行的作用与包含上述所有命令的两个批处理文件完全相同。它在当前目录中创建D:\my work
a file temp.txt
包含整个驱动器上所有文件的名称C:
具有当前用户帐户有权列出目录条目的完整路径。
为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
cd /?
dir /?
echo /?
endlocal /?
if /?
rem /?
set /?
setlocal /?
另请阅读 Microsoft 的文章:使用命令重定向运算符 https://technet.microsoft.com/en-us/library/bb490982.aspx.