如何在调用batch file时检查是否定义了一个参数?

我试图在batch file中使用以下validation逻辑,但即使没有参数提供给batch file,“使用情况”块也不会执行。

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需要a /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 

摆脱括号。

示例batch file:

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

运行上面的脚本输出:

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

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

一个更高级的例子:

⍟无限论据。

⍟存在于文件系统( filedirectory ?)或通用string

⍟指定是否是文件

⍟指定是一个目录

没有扩展,将在传统脚本中工作!

最小的代码☺

 @echoclosures

 :循环
       :: --------------------------有参数?
       if [“%〜1”] == [“”](
        回声完成。
        转到最后
       )
       :: --------------------------参数存在吗?
      如果不存在%〜s1(
        回声不存在
       )else(
        回声存在
        如果存在%〜s1 \ NUL(
          回声是一个目录
         )else(
          回声是一个文件
         )
       )
       :: --------------------------
      转移
      转到循环


 :结束

暂停

✨其他东西…✨

■在%~1 – 删除任何包装"'

■在%~s1s使得path为DOS 8.3 naming ,这是一个很好的技巧,可以在检查文件时避免文件名中的空格(这样就不需要用更多的资源来包装资源。

■如果参数是一个文件/目录或者只是一个普通的string, ["%~1"]==[""] “不能确定”,所以expression式使用括​​号和原始的未修改的%1没有"包装,如果有的话..)

如果没有使用shift的参数,并且arg-list指针已经通过了最后一个,则expression式将被评估为[""]==[""]

■这是非常具体的,你可以不使用更多的技巧(即使在windows-95的批处理脚本中也是如此)

■执行示例

将其保存为identifier.cmd

它可以识别一个无限制的参数(通常你只限于%1%9 ),只要记住使用倒逗号来包装参数,或者使用8.3命名,或者拖放它们(它会自动执行上述任一操作)。


这允许您运行以下命令:

⓵identifier.cmd identifier.cmd c:\windows并获取

存在
是一个目录
 DONE

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

存在
是一个文件
 DONE

⓷和多个参数(当然这是完整的交易..)

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

并得到

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

自然它可能会更复杂, 但好的例子应该总是简单和最小化。 🙂

希望它有助于任何人:)

发表在这里: CMD忍者 – 无限论证处理,识别如果存在于文件系统中,识别文件或目录

这里是一个工作的例子,它可以获取任意数量的APK文件(Android应用程序),并通过debugging控制台(ADB.exe)将它们安装在您的设备上: 使以前的post一个Mass安装程序不使用ADB安装多语法

 IF "%~1"=="" GOTO :Usage 

〜如果%1本身被引用,将会删除%1。

“”将保护传递的特殊字符。 例如用&ping来调用脚本

 IF "%1"=="" GOTO :Continue ..... ..... :Continue IF "%1"=="" echo No Parameter given