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%)
我正在批量编写 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%)