Batch file Windows脚本没有';当用户在空白处键入时不起作用

Batch file Windows脚本没有';当用户在空白处键入时不起作用,batch-file,windows-scripting,spritebatch,Batch File,Windows Scripting,Spritebatch,我正在批量编写Windows脚本。我对变量中的空格有问题。当用户在空格中键入时,脚本将中断 以下是我脚本的一部分: :package SET /P packageName="Set package name:" IF [%packageName%] EQU [] ( ECHO Empty package name. goto package ) ELSE ( set "packageName=%packageName: =%" echo %packageName%

我正在批量编写Windows脚本。我对变量中的空格有问题。当用户在空格中键入时,脚本将中断

以下是我脚本的一部分:

:package
SET /P packageName="Set package name:"
IF [%packageName%] EQU [] (
   ECHO Empty package name.
   goto package
) ELSE (
    set "packageName=%packageName: =%"
    echo %packageName%
    pause
)
这项工作:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:package
SET /P packageName="Set package name:"
IF "%packageName%"=="" (
   ECHO Empty package name.
   goto package
) ELSE (
    set packageName=%packageName: =%
    echo !packageName!
    pause
)
您的脚本有两个修改:

  • [%packageName%]eq[]
    被替换为
    %packageName%==”
  • 我添加了
    setlocalenabledelayedexpansion
    echo%packageName%
    echo!我
第二点是因为您正在更改IF构造中变量的值。由于解释器不知道在“编译”时新值是什么,因此必须在运行时计算变量。这就是为什么您需要
setlocalenabledelayedexpansion
而不是
%…%
。这将强制在运行时进行扩展。

此功能:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:package
SET /P packageName="Set package name:"
IF "%packageName%"=="" (
   ECHO Empty package name.
   goto package
) ELSE (
    set packageName=%packageName: =%
    echo !packageName!
    pause
)
您的脚本有两个修改:

  • [%packageName%]eq[]
    被替换为
    %packageName%==”
  • 我添加了
    setlocalenabledelayedexpansion
    echo%packageName%
    echo!我

第二点是因为您正在更改IF构造中变量的值。由于解释器不知道在“编译”时新值是什么,因此必须在运行时计算变量。这就是为什么您需要
setlocalenabledelayedexpansion
而不是
%…%
。这将强制在运行时进行扩展。

我建议使用以下代码:

@echo off
setlocal EnableDelayedExpansion
:package
rem Predefine variable packageName with a single double quote as value.
rem This value is kept if the user just hits RETURN or ENTER on prompt.
rem The single double quote is removed 2 command lines below if the user
rem does not enter anything or it is overwritten by user entered string.
set "packageName=""

set /P "packageName=Set package name: "

rem Remove double quotes from entered string. This is necessary to
rem avoid a syntax error on next command line with the IF condition.
set "packageName=!packageName:"=!"

if "!packageName!" == "" (
    echo Empty package name.
    goto package
) else (
    set "packageName=%packageName: =%"
    echo Package name with spaces:    %packageName%
    echo Package name without spaces: !packageName!
    pause
)
endlocal
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 如果/?
  • 设置/?
  • setlocal/?
尤其是执行
if/?
时输出的帮助页面,应该仔细完整地阅读,因为这有助于解释延迟扩展,因为这里必须在示例中使用它


另请参见上述代码中的ELSE分支中的2个echo行的输出,以了解在使用
定义的块中引用带有百分号或感叹号的变量之间的区别。我建议使用以下代码:

@echo off
setlocal EnableDelayedExpansion
:package
rem Predefine variable packageName with a single double quote as value.
rem This value is kept if the user just hits RETURN or ENTER on prompt.
rem The single double quote is removed 2 command lines below if the user
rem does not enter anything or it is overwritten by user entered string.
set "packageName=""

set /P "packageName=Set package name: "

rem Remove double quotes from entered string. This is necessary to
rem avoid a syntax error on next command line with the IF condition.
set "packageName=!packageName:"=!"

if "!packageName!" == "" (
    echo Empty package name.
    goto package
) else (
    set "packageName=%packageName: =%"
    echo Package name with spaces:    %packageName%
    echo Package name without spaces: !packageName!
    pause
)
endlocal
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 如果/?
  • 设置/?
  • setlocal/?
尤其是执行
if/?
时输出的帮助页面,应该仔细完整地阅读,因为这有助于解释延迟扩展,因为这里必须在示例中使用它


另请参见上述代码中的ELSE分支中的2个echo行的输出,以了解在使用
)定义的块中引用带有百分号或感叹号的变量之间的区别。

除了“变量搜索/替换”之外,您的脚本几乎是正确的如果
,则其位置应在“
之前”


除了“变量搜索/替换”之外,您的脚本几乎是正确的,它的位置在“
IF
”之前


将引号(
)与
if
一起使用,而不是
[
]
,不幸的是,此选项不起作用。(语法错误)什么不起作用?请详细描述如果“%packageName%”等于(
发出语法错误?@MichaelS:是的,与Stephan 26分钟前建议的完全相同的更改…在
if
中使用引号(
),而不是
[
]
),不幸的是,这个选项不起作用。(语法错误)什么不起作用?请详细描述您的期望和实际得到的结果…
如果“%packageName%”eq(
发出语法错误?@MichaelS:是的,与Stephan 26分钟前建议的更改完全相同…如果用户只键入一个或多个空格,此代码将无法正常工作。但由于替换操作,此代码无法正常工作。因此这不是问题的一部分。对于这种情况,我建议在ELSE中进行额外的if检查块。只需在
set/p
之后移动
set-packageName=%packageName:=%
即可。如果用户只键入一个或多个空格,则此代码无法正常工作。但由于替换操作,此代码无法正常工作。因此,这不是问题的一部分。对于这种情况,我建议在ELSE bl中进行额外的if检查只需在
set/p
之后移动
set packageName=%packageName:=%
,就足够了