Batch file 启动/调用批处理文件时,如何检查是否定义了参数?
我试图在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供任何参数,“usage”块也不会执行Batch file 启动/调用批处理文件时,如何检查是否定义了参数?,batch-file,arguments,Batch File,Arguments,我试图在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供任何参数,“usage”块也不会执行 if ("%1"=="") goto usage @echo This should not execute @echo Done. goto :eof :usage @echo Usage: %0 <EnvironmentName> exit 1 如果(“%1”==”)转到用法 @这不应该执行 @回音完毕。 后藤:eof :用法 @回显用法:%0 出口1 我做错了什么?检
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
如果(“%1”==”)转到用法
@这不应该执行
@回音完毕。
后藤:eof
:用法
@回显用法:%0
出口1
我做错了什么?检查是否设置了命令行参数可以是
[%1]=[]
,但是,%1==”
也会起作用
我还修复了用法echo中的语法错误,以转义大于和小于符号。此外,exit
需要一个/B
参数,否则CMD.exe
将退出
@echo off
if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1
@echo关闭
如果[%1]=[]转到使用情况
@这不应该执行
@回音完毕。
后藤:eof
:用法
@回显用法:%0^
退出/B 1
去掉括号
批处理文件示例:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
运行上述脚本的输出:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
我认为它实际上是将括号作为字符串的一部分,并对它们进行比较
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
~如果引用了%1本身,则将取消引用%1
“”将防止传递特殊字符。例如,使用ping调用脚本(&p)
更高级的示例:
⍟ 无限制的争论
⍟ 存在于文件系统上(文件或目录或目录?)或通用字符串
⍟ 指定是否为文件
⍟ 指定是一个目录
⍟ 没有扩展,将在遗留脚本中工作
⍟ 最小码☺
⓶identifier.cmd“c:\Program Files(x86)\Microsoft Office\OFFICE11\WINWORD.EXE”
并且得到
exist
is a directory
done
exist
is a file
done
exist
is a directory
exist
is a file
exist
is a file
not exist
done.
当然,它可能要复杂得多,
但是好的例子应该总是简单和最少。:)
希望它能帮助任何人:)
此处发布:
下面是一个工作示例,它可以获取任意数量的APK文件(Android应用程序),并通过调试控制台(ADB.exe)将其安装到您的设备上:
如果“%1”==”将失败,则此操作的所有版本都将在以下情况下失败
某些有毒的性格条件。
仅当定义或未定义是安全的时这与其他答案相同,但仅使用一个标签并将用法放在第一位,这还使其成为脚本的一种文档,通常也放在顶部:
@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo param%%1 the file to operate on
echo param%%1 another file
:: --------------------------
exit /B 1
:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...
但是,如果您不必使用cmd/batch,请在WSL或powershell上使用bash,它们的语法更为合理,功能也更少神秘。[%1]==[]比“%1”==”,因为它可以正确处理%1本身包含双引号的情况。%1“==”将出现“此时意外”消息错误。请注意,如果您没有使用命令行参数,而是使用设置变量(我不知道正确的批处理术语),您可能希望使用%myvar%”“==”
,因为如果myvar
中有空格且没有引号,您将得到“此时意外”消息。@如果未定义VarName,则可以使用块检查Pat集合变量。另外,由于在比较中没有使用引号,对tukushan也加1。不要这样做。决不会。“%$1”==”
也会起作用,并处理以下情况:%1有双引号“%$1”==”
处理变量中的空格,而[]
版本没有。如果“%1”==”
如果arg有空格,则会崩溃。例如:run.bat“a b”
@如果“%~1”==”
这是最佳答案,amr将使用的最佳答案。其他答案适用于某些情况,但对于像run.bat“a b”
@wisbucky这样似乎没有问题的特殊情况,则会失败。我遗漏了什么?@ruffin,例如:run.bat”“
将不会被[%1]=[]
捕获。这会导致run.bat“a b”
崩溃,如果[未]定义…
不能与%1
这样的参数一起工作。你有没有一个例子,如果“%~1”不起作用?
可能与@double beep重复-这里的问题(由daniel fortunov提出)是在你提到的问题发布前一年首先提出的。哪一个是(可能的)重复?@KevinFegan,因为另一个问题有更多的观点和答案。
exist
is a directory
exist
is a file
exist
is a file
not exist
done.
@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo param%%1 the file to operate on
echo param%%1 another file
:: --------------------------
exit /B 1
:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...