Batch file Windows脚本没有';当用户在空白处键入时不起作用
我正在批量编写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%
: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!我代码>
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:=%
,就足够了