我正在尝试在批处理文件中使用以下验证逻辑,但即使没有为批处理文件提供参数,也不会执行“usage”块。
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
我做错了什么?
答案 0 :(得分:132)
检查是否已设置命令行参数可以是[%1]==[]
,但是,如Dave Costa points out,"%1"==""
也可以。
我还修复了使用回显中的语法错误,以逃避大于号和小于号的符号。此外,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
答案 1 :(得分:15)
更高级的例子:
⍟无限论据。
⍟存在于文件系统(
file
或directory
?)或通用string
上。⍟指定if是否为文件
⍟指定是一个目录
⍟没有扩展,可以在旧版脚本中使用!
⍟最小代码☺
@echo off :loop ::-------------------------- has argument ? if ["%~1"]==[""] ( echo done. goto end ) ::-------------------------- argument exist ? if not exist %~s1 ( echo not exist ) else ( echo exist if exist %~s1\NUL ( echo is a directory ) else ( echo is a file ) ) ::-------------------------- shift goto loop :end pause
✨其他东西......
■在%~1
中 - ~
删除任何包裹"
或'
。
■在%~s1
中 - s
使路径成为DOS 8.3 naming
,这是一个很好的技巧,可以在检查内容时避免文件名中的空格(这样就不需要换行了资源更多"
s。
■["%~1"]==[""]
&#34;无法确定&#34;如果参数是文件/目录或者只是一个通用字符串,那么表达式使用括号和原始未修改的%1
(只是没有"
包装,如果有的话......)
如果没有关于我们是否使用shift
并且arg-list指针已经通过最后一个的参数,那么表达式将被评估为[""]==[""]
。
■这是您可以在不使用更多技巧的情况下具体实现(即使在windows-95的批处理脚本中也能正常工作......)
将其另存为identifier.cmd
它可以识别无限制的参数(通常你只限于%1
- %9
),只记得用倒置逗号包装参数,或者使用8.3命名,或者拖放它们(它会自动执行上述任一操作。)
这允许您运行以下命令:
⓵identifier.cmd c:\windows
并得到
exist is a directory done
⓶identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
并得到
exist is a file done
⓷和多个参数(当然这是整个交易......)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
并获得
exist is a directory exist is a file exist is a file not exist done.
自然可能会复杂得多, 但很好的例子应该总是简单而且极简。:)
这是一个工作示例,可以获取任意数量的APK文件(Android应用程序)并通过调试控制台(ADB.exe)将它们安装到您的设备上: Make The Previous Post A Mass APK Installer That Does Not Uses ADB Install-Multi Syntax 子>
答案 2 :(得分:14)
摆脱括号。
示例批处理文件:
echo "%1"
if ("%1"=="") echo match1
if "%1"=="" echo match2
在脚本上方运行输出:
C:\>echo ""
""
C:\>if ("" == "") echo match1
C:\>if "" == "" echo match2
match2
我认为它实际上是将括号作为字符串的一部分并进行比较。
答案 3 :(得分:6)
IF "%~1"=="" GOTO :Usage
如果引用%1本身,〜将取消引用%1。
&#34; &#34;将保护免受通过的特殊字符。例如,用&amp; ping
调用脚本答案 4 :(得分:2)
IF "%1"=="" GOTO :Continue
.....
.....
:Continue
IF "%1"=="" echo No Parameter given
答案 5 :(得分:0)
如果“%1”==“”将失败,则所有版本都将失败 某些毒药特征条件。 只有在定义或未定义的情况下才是安全的
答案 6 :(得分:0)
这与其他答案相同,但是仅使用一个标签并将使用情况放在首位,这另外使它成为脚本的一种文档推荐,通常也放在顶部:
@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,它们具有更合理的语法和更少的神秘功能。