Windows 当用户输入空格时脚本不工作

Windows script doesn't work when user types in a whitespace

我正在批量编写 Windows 脚本。我对变量中的 whitespaces 有疑问。当用户输入 space 时,脚本中断。

这是我的脚本部分:

: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%] EQU [] 替换为 "%packageName%"==""
  • 我添加了 SETLOCAL ENABLEDELAYEDEXPANSION 并将 echo %packageName% 更改为 echo !packageName!

第二点是因为您正在更改 IF 结构中的变量值。由于解释器不知道 "compile" 时的新值是什么,因此您必须在 运行 时评估变量。这就是为什么您需要 SETLOCAL ENABLEDELAYEDEXPANSION!...! 而不是 %...%。这会在 运行 时强制展开。

我建议使用此代码:

@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

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • if /?
  • set /?
  • setlocal /?

特别是执行 if /? 时的帮助页面输出应该仔细和完整地阅读,因为这有助于解释延迟扩展,因为它必须在此处用于示例。

另请参阅上面代码中 ELSE 分支中的 2 echo 行的输出,以了解引用变量之间的区别在用 ( ... ).

定义的块中带有百分号或感叹号

除了 "variable search/replace" 之外,您的脚本几乎是正确的,它的位置在“IF

之前
@echo off
:package
set /p packagename="set package name:"
set packagename=%packagename: =%
if [%packagename%] equ [] (
echo empty package name &goto package
) else (echo %packagename%)