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

时间:2009-05-06 16:45:12

标签: batch-file arguments

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

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

@echo This should not execute

@echo Done.
goto :eof

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

我做错了什么?

7 个答案:

答案 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)

  

更高级的例子:

     

⍟无限论据。

     

⍟存在于文件系统(filedirectory?)或通用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.

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

希望它可以帮助任何人:)

发布在此处:CMD Ninja - Unlimited Arguments Processing, Identifying If Exist In File-System, Identifying If File Or Directory

这是一个工作示例,可以获取任意数量的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,它们具有更合理的语法和更少的神秘功能。