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

Dan*_*nov 92 arguments batch-file

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

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

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Iai*_*ain 139

检查命令行参数是否已设置可以是[%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
Run Code Online (Sandbox Code Playgroud)

  • [%1] == []优于"%1"=="",因为它将正确处理%1本身包含双引号的情况."%1"==""将出现"此时意外"消息. (16认同)
  • `"%〜1"==""`也可以工作并处理%1有双引号的情况 (7认同)
  • `"%〜1"==""`处理变量中的空格,而`[]`版本则不处理. (7认同)
  • 请注意,如果你没有使用命令行参数但是`set`变量(我不知道正确的批处理术语),你可能想要使用`"%myvar%"==""`因为如果`myvar`有它中的空格并没有引用,你会得到"此时意外"的消息. (2认同)

小智 16

一个更高级的例子:

⍟无限论据.

⍟存在于文件系统(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

✨其他东西..✨

■in %~1- ~删除任何包装"'.

■in %~s1- s使路径成为DOS 8.3 naming,这是一个很好的技巧,可以在检查东西时避免文件名中的空格(这样就不需要用更多的"s 包装资源了.

["%~1"]==[""]"无法确定"如果参数是文件/目录或只是一个通用字符串,那么表达式使用括​​号和原始未修改%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.

自然它可能会复杂得多, 但很好的例子应该总是简单而且极简.:)

希望它能帮到任何人:)

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

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


Dav*_*sta 14

摆脱括号.

样本批处理文件:

echo "%1"

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

if "%1"=="" echo match2
Run Code Online (Sandbox Code Playgroud)

运行在脚本上方的输出:

C:\>echo "" 
""

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

C:\>if "" == "" echo match2 
match2
Run Code Online (Sandbox Code Playgroud)

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


Amr*_*Ali 6

IF "%~1"=="" GOTO :Usage
Run Code Online (Sandbox Code Playgroud)

如果%1本身被引用,〜将取消引用%1.

""将保护免受特殊字符传递.例如,使用&ping调用脚本