如何检查启动/调用批处理文件时是否定义了参数?

问题描述 投票:0回答:8

我尝试在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供参数,“使用”块也永远不会执行。

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

我做错了什么?

batch-file arguments
8个回答
185
投票

检查命令行参数是否已设置可以是

[%1]==[]
,但是,正如 Dave Costa 指出的那样,"%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
    

28
投票
更高级的示例:

⍟ 无限的参数。

⍟ 存在于文件系统上(

file

directory
?)或通用 
string

⍟指定是否是文件

⍟指定是一个目录

扩展,可以在遗留脚本中工作!

最少代码☺

@回声关闭 :环形 ::---------------------- 有争论吗? if ["%~1"]==[""] ( 回声完成。 转到结束 ) ::------------------------- 争论存在吗? 如果不存在%~s1( 回显不存在 ) 别的 ( 回声存在 如果存在 %~s1\NUL ( echo 是一个目录 ) 别的 ( 回声是一个文件 ) ) ::------------------------- 转移 转到循环 :结尾 暂停

✨其他东西..✨

%~1

中的

■ - 
~
 去除所有包装 
"
'

%~s1

中的

■ - 
s
使路径成为
DOS 8.3 naming
,这是一个很好的技巧,可以在检查内容时避免文件名中出现空格(这样就不需要用更多的
"
来包装资源) .

["%~1"]==[""]

“无法确定”参数是文件/目录还是只是通用字符串,因此表达式使用括号和原始未修改的
%1
(只是没有 
"
 换行,如果任何..)

如果没有参数,如果我们使用了

shift

 并且 arg-list 指针已经传递了最后一个,则表达式将被计算为 
[""]==[""]

■ 这是您可以在不使用更多技巧的情况下尽可能具体的(它甚至可以在 windows-95 的批处理脚本中工作......)

■ 执行示例

另存为

identifier.cmd


它可以识别无限的参数(通常您仅限于

%1

-
%9
),只需记住用引号将参数括起来,或使用8.3命名,或将它们拖放到(它会自动执行上述任一操作) .


这允许您运行以下命令:

identifier.cmd c:\windows

并得到

存在 是一个目录 完毕


identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"

并得到

存在 是一个文件 完毕


⓷和多个参数

(当然这是全部..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world


并获得

存在 是一个目录 存在 是一个文件 存在 是一个文件 不存在 完毕。

自然它可以复杂得多, 但是好的例子应该总是简单且最少的。:)

希望它对任何人有帮助:)

发布在这里:CMD Ninja - 无限参数处理,识别文件系统中是否存在,识别文件或目录

这是一个工作示例,它获取任意数量的 APK 文件(Android 应用程序)并通过调试控制台(ADB.exe)将它们安装在您的设备上: 将上一篇文章制作为不使用 ADB Install-Multi 语法的批量 APK 安装程序


16
投票
去掉括号。

示例批处理文件:

echo "%1" if ("%1"=="") echo match1 if "%1"=="" echo match2

运行上述脚本的输出:

C:\>echo "" "" C:\>if ("" == "") echo match1 C:\>if "" == "" echo match2 match2

我认为它实际上是将括号作为字符串的一部分,并对它们进行比较。


6
投票
IF "%~1"=="" GOTO :Usage

~ 如果 %1 本身被引用,则会取消引用 %1。

“”将防止传递特殊字符。例如使用 &ping 调用脚本


4
投票
这与其他答案相同,但仅使用一个标签并将用法放在第一位,这还使其充当脚本的一种文档推荐,通常也放置在顶部:

@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
投票
IF "%1"=="" GOTO :Continue ..... ..... :Continue IF "%1"=="" echo No Parameter given
    

0
投票
如果“%1”==“”将失败,则所有版本都将失败 某些毒物特征条件。 只有 IF DEFINED 或 IF NOT DEFINED 才是安全的


0
投票
你可以有一个多行 if 语句:

if "%1"=="" ( echo Usage: ApplyImage WimFileName exit 1 )
    
© www.soinside.com 2019 - 2024. All rights reserved.