如何在 Windows XP CMD.EXE 命令行中的变量中设置/使用空字符串值?

Las*_*lko 10 windows command-line windows-xp cmd.exe

使用 SET 为变量设置一个空值在 Windows XP .CMD 脚本中效果很好。但是,当直接从命令行使用时,相同的 SET 命令在相同的 CMD 解释器中表现不同:

尝试在 CMD.EXE 命令行中测试它:

C:\>set Q=

C:\>echo %Q%
%Q%

C:\>echo "%Q%"
"%Q%"

C:\>set Q=/Q

C:\>echo %Q%
/Q

C:\>echo "%Q%"
"/Q"
Run Code Online (Sandbox Code Playgroud)

尝试使用这样的 .CMD 脚本对其进行测试:

set Q=
echo %Q%
echo "%Q%"
set Q=/Q
echo %Q%
echo "%Q%"
Run Code Online (Sandbox Code Playgroud)

运行它:

C:\>c.cmd

C:\>set Q=

C:\>echo
ECHO is on.

C:\>echo ""
""

C:\>set Q=/Q

C:\>echo /Q
/Q

C:\>echo "/Q"
"/Q"
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

这是雷德蒙德的一个好笑话,还是对这种差异有任何合理的解释?

当 .CMD 脚本中的行在命令行中使用时行为不同时,我应该如何测试它们?

如何在 CMD 命令行中将变量正确设置为空字符串值,以及如何引用该变量以便获得该空字符串?

小智 7

tl;dr - 你遇到的问题是echo %Q%扩展到echo. 用echo.%Q%

扩展答案

echo 命令有 4 种行为:

  • echo on - 启用回显命令。
  • echo off - 禁用回显命令。
  • echo - 显示回显命令选项的状态。
  • echo ...-...在屏幕上放置和换行。

如果您将变量作为参数传递给 echo,并且它是空的,它将扩展为echo,并显示类似“ECHO 已关闭”的内容。

许多人使用echo.命令来显示空字符串(读取:输出换行符),但不是每个人都知道echo.可以用来明确指定您想要的输出行为。例如:

  • echo.on- 将输出on和换行
  • echo.off- 将输出off和换行
  • echo. - 将输出换行符
  • echo.something- 将输出something和换行
  • echo.%Q%- 将输出内容%Q%是否为 ""/"on"/"off" 或其他任何内容。

请记住,.和参数之间不应有空格。

参见https://technet.microsoft.com/en-us/library/bb490897.aspx?f=255&MSPPError=-2147217396

  • 因为你“tl; dr”,你错过了问题的全部要点。;-) (3认同)

Vic*_*ema 5

我在我的脚本中遇到了完全相同的问题。目前我没有找到将变量设置为空字符串的方法。我刚刚找到了如何用一个空格初始化它:

set "Var= "
Run Code Online (Sandbox Code Playgroud)

这些引号是可选的。但它们确实有助于显式地查看该空间并在终端空白清理程序的情况下保留它。

您可以在此处找到更多信息:SET 命令


JSa*_*hez 1

@Laszlo Valko:你没有说你使用哪个CP,但我会使用Alt-255“伪造”空变量,这是一个“不可见”字符,至少在CP 437中是这样。使用你的例子:

\n\n
@echo off\n::The line below contains the invisible character (Alt-255)\necho Q set to "Invisible"\nset Q=\xc2\xa0\nset Q\necho %Q%\necho "%Q%"\necho Q set to Empty\nset Q=\nset Q\necho %Q%\necho "%Q%"\necho Q set to "/Q"\nset Q=/Q\nset Q\necho %Q%\necho "%Q%"\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用SET Q将显示所有以 Q 开头的变量。尝试一下SET C,您就会明白我的意思。正如您所看到的,当变量设置为空白时,它被删除。当您执行命令时,ECHO %Q%命令解释器认为您只是在说ECHO哪个,然后它会告诉您状态:开或关。由于我@echo off在脚本开头使用,它报告回声已关闭。

\n\n

希望有帮助!

\n