我尝试在批处理文件中使用以下验证逻辑,但即使没有向批处理文件提供参数,“使用”块也永远不会执行。
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
我做错了什么?
检查命令行参数是否已设置可以是
[%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
更高级的示例:@回声关闭 :环形 ::---------------------- 有争论吗? if ["%~1"]==[""] ( 回声完成。 转到结束 ) ::------------------------- 争论存在吗? 如果不存在%~s1( 回显不存在 ) 别的 ( 回声存在 如果存在 %~s1\NUL ( echo 是一个目录 ) 别的 ( 回声是一个文件 ) ) ::------------------------- 转移 转到循环 :结尾 暂停⍟ 无限的参数。
⍟ 存在于文件系统上(
file
或directory
?)或通用string
。⍟指定是否是文件⍟指定是一个目录
⍟
无扩展,可以在遗留脚本中工作!
⍟最少代码☺
✨其他东西..✨
%~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 安装程序
示例批处理文件:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
运行上述脚本的输出:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
我认为它实际上是将括号作为字符串的一部分,并对它们进行比较。
IF "%~1"=="" GOTO :Usage
~ 如果 %1 本身被引用,则会取消引用 %1。
“”将防止传递特殊字符。例如使用 &ping 调用脚本
@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,它们具有更合理的语法和更少的晦涩功能。
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
if "%1"=="" (
echo Usage: ApplyImage WimFileName
exit 1
)