我正在批量编写Windows脚本。我对变量中的空格有问题。当用户键入空格时,脚本会中断。
这是我脚本的一部分:
:package
SET /P packageName="Set package name:"
IF [%packageName%] EQU [] (
ECHO Empty package name.
goto package
) ELSE (
set "packageName=%packageName: =%"
echo %packageName%
pause
)
答案 0 :(得分:4)
这个工作:
@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结构中变量的值。由于解释器在“编译”时不知道新值是什么,因此必须在运行时评估变量。这就是您需要SETLOCAL ENABLEDELAYEDEXPANSION
和!...!
而不是%...%
的原因。这会在运行时强制扩展。
答案 1 :(得分:2)
我建议使用此代码:
@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
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
if /?
set /?
setlocal /?
特别是执行if /?
时输出的帮助页面应该仔细阅读,因为这有助于解释延迟扩展,因为必须在这里使用示例。
另请参阅上面代码中 ELSE 分支中2 echo 行的输出,以了解引用具有百分号的变量或带有感叹号的变量之间的区别使用(
... )
定义的块。
答案 2 :(得分:0)
您的脚本几乎正确,但“变量搜索/替换”除外,其位置应在“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%)