批处理:在Set / p输入中使用Spaces的奇数问题

时间:2015-12-02 03:45:20

标签: batch-file cmd

在批处理中将空格输入 Set / p 命令时遇到问题。这是我的一段代码,它将输入作为命令(基本上是CMD)。

@echo off
:Set
set /p op="C:\Users\Bob\
if %op%==%op% goto Run
:Run
%op%
goto Set

这又是我代码的基本部分,但例如我输入

Net user

它将逃脱并关闭窗口。 Set / P命令有什么问题? TIA

1 个答案:

答案 0 :(得分:7)

无。嗯,平衡报价总是一个好主意。

set /p op="C:\Users\Bob\"

这对于缓解问题毫无帮助。

set /p op=C:\Users\Bob\

会做同样的事情。报价不相关

set /p "op=C:\Users\Bob\ "
set /p op="C:\Users\Bob\ "

会在 \

之后显示一个空格

第二种语法类似于" safe" set语法

set "op=C:\Users\Bob\ "

= " 之间的字符串设置为变量。以这种方式定位引号可确保该行上的尾随空格包含在分配的值中。

set op=C:\Users\Bob\ 
set "op=C:\Users\Bob\"   

实际上可能做不同的事情。第二个将确保将C:\Users\Bob\分配给op。第一个 - 好,op会获得C:\Users\Bob\ 加上行上的任何尾随空格(type时很方便隐藏

您的问题是,如果您的条目包含空格,

if %op%==%op% goto Run

替换op的值,然后检查结果的有效语法,以便得到

if Net user==Net user goto Run

这是无效的语法。 if的语法是

  

如果 string 运算符 string dothis

所以批处理看到user它需要一个运算符并显示语法错误。如果您通过双击运行此批处理,则会关闭cmd实例。这就是首选从提示符运行批处理的原因。

解决方案是`"用双引号括起字符串"``

if "%op%"=="%op%" goto Run

变为

if "Net user"=="Net user" goto Run

因为批处理看到一系列由空格分隔的字符串"作为单引号字符串。

btw - 通常的做法是避免使用关键字标签(如set