请参考Stack Overflow上的以下答案:
- 如何设置带有空格的环境变量?
在命令行中使用“set var = text”后,“echo %var%”没有输出任何字符串?
它们解释了推荐使用语法 set "VariableName=variable value"
来定义环境变量以及推荐此语法的原因。
- ECHO命令为什么会在文件中打印一些额外的尾随空格?
它解释了为什么在ECHO命令行上留下重定向运算符 >
左侧的空格字符也会作为尾随空格写入文件中,以及如何安全地避免这种情况发生在写入文件中的文本变量上。
还可以参考Microsoft关于 使用命令重定向运算符 的文档。
在除ECHO之外的其他命令行上,左侧留有一个空格通常不会有问题。
一般来说,在文件或文件夹路径等参数字符串中多次使用
"
是错误的。应该只有一个
"
在开头和结尾。这是通过在命令提示符窗口中运行
cmd /?
命令后输出的 Windows 命令处理器帮助页面解释的。
Microsoft 关于
文件、路径和命名空间的命名的文档解释了在 Windows 上目录分隔符是
\ 而不是
/,因此在 Windows 批处理文件中不应该在文件/文件夹路径中使用
/
。
在命令提示符窗口中运行
call /?
命令的帮助输出解释了如何使用修饰符引用批处理文件的参数。
根据上述信息和引用页面重新编写的代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "path2=%~5"
set "path2=%path2:/=\%"
>"tmp.txt" echo %2
dir "%path2%" /B /S >>"tmp.txt" 2>nul
"%ProgramFiles%\Microsoft Office\root\vfs\ProgramFilesX86\Microsoft Office\Office16\DCF\SPREADSHEETCOMPARE.EXE" "tmp.txt"
endlocal
tmp.txt
文件中的第一行包含批处理文件传递的第二个参数,即带或不带双引号。
以下代码是为了始终安全地将第二个参数写入文件 tmp.txt
,即使批处理文件传递的第二个参数是 "Hello & welcome!"
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "path2=%~5"
set "path2=%path2:/=\%"
set "Argument2=%~2"
setlocal EnableDelayedExpansion
echo !Argument2!>"tmp.txt"
endlocal
dir "%path2%" /B /S >>"tmp.txt" 2>nul
"%ProgramFiles%\Microsoft Office\root\vfs\ProgramFilesX86\Microsoft Office\Office16\DCF\SPREADSHEETCOMPARE.EXE" "tmp.txt"
endlocal
"
>tmp.txt echo %~2
" 不能使用,因为它无法处理类似于 "
Hello & welcome!
" 的内容。Windows 命令处理器会将第一个由普通空格、水平制表符、逗号、等号或非中断空格(在 OEM 代码页中)分隔的字符串解释为要执行的命令或应用程序,如
在 Windows 批处理文件中使用单行多个命令 中所述。
"
tmp.txt
" 可以在批处理文件中的任何地方被写入,也可以只用 "
tmp.txt
"。但是,即使不需要,将完整的文件/文件夹参数字符串括在双引号中也永远不会出错,因为该字符串不包含空格或这些字符之一:
&()[]{}^=;!'+,`~
。因此,始终将完整的文件/文件夹参数字符串括在双引号中是一个好习惯。例如,在两个批处理文件中运行替换操作,搜索
tmp.txt
并使用
%TEMP%\%~n0.tmp
作为替换字符串,将导致在临时文件目录中使用当前批处理文件的名称作为文件名和扩展名为
.tmp
的临时文件,而不管批处理文件的名称是什么,临时文件的路径是什么。
最后一个建议是阅读 this answer 了解有关命令 SETLOCAL 和 ENDLOCAL 的详细信息。
在达到批处理文件执行的退出点之前,应该最终删除临时文件。
%~5
而不是%5
来删除它们。此外,set命令的推荐语法是Set "VariableName=VariableValue"
。因此,我建议在您的脚本中使用以下内容:Set "path2=%~5"
,以删除周围的双引号,或者如果您想保留它们,则使用Set "path2=%5"
。 - Compo\
而不是/
(尽管由于一些智能自动校正,有些命令可能会接受两者)! - aschipfl