bla*_*k3r 194 windows shell cmd batch-file
我需要测试是否设置了变量.我已经尝试了几种技术,但他们忽视了,只要%1用双引号包围时,如情况%1是"c:\some path with spaces".
IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.
Run Code Online (Sandbox Code Playgroud)
根据此站点,这些是受支持的IF语法类型.所以,我没有办法做到这一点.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
Run Code Online (Sandbox Code Playgroud)
Dan*_*ory 272
使用方括号而不是引号:
IF [%1] == [] GOTO MyLabel
Run Code Online (Sandbox Code Playgroud)
括号是不安全的:只使用方括号.
jam*_*lin 137
您可以使用:
IF "%~1" == "" GOTO MyLabel
Run Code Online (Sandbox Code Playgroud)
剥去外部报价集.通常,这是一种比使用方括号更可靠的方法,因为即使变量中包含空格,它也会起作用.
jeb*_*jeb 36
最好的半解决方案之一是复制%1到变量然后使用延迟扩展,作为delayedExp.对任何内容都是安全的.
set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something
Run Code Online (Sandbox Code Playgroud)
这样做的好处是处理param1是绝对安全的.
param1的设置在许多情况下都会起作用,比如
test.bat hello"this is"a"test
test.bat you^&me
Run Code Online (Sandbox Code Playgroud)
但它会失败,如奇怪的内容
test.bat "&"^&
Run Code Online (Sandbox Code Playgroud)
如果你想成为99%防弹,你可以阅读如何接收最奇怪的命令行参数?
And*_*ris 17
来自IF/?:
如果启用了命令扩展,则IF更改如下:
Run Code Online (Sandbox Code Playgroud)IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command......
DEFINED条件就像EXISTS一样,除了它采用环境变量名称,如果定义了环境变量,则返回true.
小智 7
使用"IF DEFINED变量命令"来测试批处理文件中的变量.
但是如果你想测试批处理参数,请尝试下面的代码以避免棘手的输入(例如"1 2"或ab ^> cd)
set tmp="%1"
if "%tmp:"=.%"==".." (
echo empty
) else (
echo not empty
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有足够的声誉来评论或投票给我自己写的答案。
最初,OP的问题说的是“变量”而不是“参数”,这引起了极大的混乱,尤其是因为这是google中搜索如何测试空白变量的第一链接。自从我获得原始答案以来,Stephan已经编辑了原始问题,以使用正确的术语,但是我决定删除该答案,以消除任何混淆,而不是删除我的答案,尤其是在Google仍然派人来这里询问变量的情况下:
%1不是变量!这是一个命令行参数。
非常重要的区别。后面带有数字的单个百分号表示命令行参数而不是变量。
使用set命令设置变量,并使用2个百分号调用-前一个和后一个。例如%myvar%
要测试空变量,请使用“如果未定义”语法(显式用于变量的命令不需要任何百分号),例如:
set myvar1=foo
if not defined myvar1 echo You won't see this because %myvar1% is defined.
if not defined myvar2 echo You will see this because %myvar2% isn't defined.
Run Code Online (Sandbox Code Playgroud)
(如果要测试命令行参数,那么我建议参考jamesdlin的答案。)
我根据这里的答案创建了这个小批量脚本,因为有很多有效的。只要您遵循相同的格式,就可以随意添加:
REM Parameter-testing
Setlocal EnableDelayedExpansion EnableExtensions
IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)
pause
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用
if defined (variable) echo That's defined!
if not defined (variable) echo Nope. Undefined.
Run Code Online (Sandbox Code Playgroud)
小智 5
我用下面的代码测试,这很好。
@echo off
set varEmpty=
if not "%varEmpty%"=="" (
echo varEmpty is not empty
) else (
echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
echo varNotEmpty is not empty
) else (
echo varNotEmpty is empty
)
Run Code Online (Sandbox Code Playgroud)