How can I check if an argument is defined when starting/calling a batch file?

I'm trying to use the following validation logic in a batch file but the "usage" block never executes even when no parameter is supplied to the batch file.

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


@echo This should not execute


@echo Done.
goto :eof


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

What am I doing wrong?

134759 次浏览

检查是否设置了命令行参数可以是 [%1]==[],但是,作为 Dave Costa points out"%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

Get rid of the parentheses.

批处理文件示例:

echo "%1"


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


if "%1"=="" echo match2

运行上述脚本的输出:

C:\>echo ""
""


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


C:\>if "" == "" echo match2
match2

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

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

~ 如果引用% 1本身,将取消引用% 1。

将防止传递特殊字符。例如,使用“ & ping”调用脚本

一个更高级的例子:

Something 无限的论点。

在文件系统(filedirectory?)或通用 string上存在。

指定 if 是一个文件

指定是一个目录

Something 没有扩展,将在遗留脚本中工作!

Something minimal code ☺

@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

Something other stuff. . something

■ 在 %~1-~去除任何包裹 "'

■ 在 %~s1中—— s使路径为 DOS 8.3 naming,这是一个很好的技巧,在检查内容时避免在文件名中使用空格(这样就不需要用更多的 "来包装资源。

["%~1"]==[""]“不能确定”参数是文件/目录还是只是泛型字符串,所以表达式使用了括号和原始的未修改的 %1(如果有的话,只是没有包装 ")。.)

如果没有使用 shift的参数,并且 arg-list 指针已经传递了最后一个参数,那么表达式将被求值为 [""]==[""]

■ 这是你不需要使用更多技巧就可以做到的最具体的事情(即使在 windows-95的批处理脚本中也可以做到...)

■ 执行例子

保存为 identifier.cmd

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


这允许您运行以下命令:

Something identifier.cmd c:\windows 并得到

exist
is a directory
done

Something identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" 并得到

exist
is a file
done

Something 和多个参数 (of course this is the whole-deal..)

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.

当然它可以复杂得多, 但是好的例子应该是简单的和最小的。 :)

希望对大家有所帮助:)

点此发布: 无限参数处理,识别是否存在于 File-System,识别是否文件或目录

下面是一个工作示例,它接受任意数量的 APK 文件(Android 应用程序) ,并通过调试控制台(ADB.exe)将它们安装到您的设备上: 使之前的帖子成为一个不使用 ADB 安装的大规模 APK 安装程序-多语法

如果“% 1”= = “”将失败,则此命令的所有版本都将在 某些毒性特征条件。 只有已定义或未定义的才是安全的

This is the same as the other answers, but uses only one label and puts the usage first, which additionally makes it serve as a kind of documentation commend of the script which is also usually placed at the top:

@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,它们具有更健全的语法和更少的神秘特性。