Windows 7批处理文件:如何检查参数是否已传递给批处理文件

osc*_*tin 24 batch-file windows-7

回到90年代中期,我记得做过这样的事情:

if %1==. dir
Run Code Online (Sandbox Code Playgroud)

基本上,如果你把上面的代码放在dodir.bat并自己运行而不传递任何参数,它将运行dir命令.但是,如果您将任何内容作为参数传递给它,它将不会运行dir命令.

我似乎无法在我的Windows 7批处理文件中使用它.也许我不记得正确的语法.有帮助吗?

Tol*_*lga 54

if %1.==. dir将打破如果所述参数包括等的各种符号",<

if "%1"==""如果参数包含quote("),则会中断.

if "%~1"==""改为使用:

if "%~1"=="" (
    echo No parameters have been provided.
) else (
    echo Parameters: %*
)
Run Code Online (Sandbox Code Playgroud)

这适用于所有版本的Windows和DOS.

单元测试:

C:\>test
No parameters have been provided.

C:\>test "Lots of symbols ~@#$%^&*()_+<>?./`~!, but works"
Parameters: "Lots of symbols ~@#$%^&*()_+<>?./`~!, but works"
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明或传递%~1的参考吗? (2认同)

And*_*y M 19

实际上当时是(注意后).你可以在Windows 7中使用它,它应该工作.if %1.==. command.%1

用法示例:

if %1.==. (
    echo No parameters have been provided.
) else (
    echo Parameters:
    echo %*
)
Run Code Online (Sandbox Code Playgroud)

  • @RishabhBhatnagar:我不相信它代表任何特定的东西。它的存在只是为了避免在“%1”计算结果为空字符串时出现语法错误。它可能是其他一些字符,实际上我已经看到其他字符被使用(例如`if %1A==A`),但是`.`可能在这个特定的模式中最常使用。请注意,这种模式在过去 DOS 时代很流行。如今,正如[Tolga建议](/sf/answers/1177337661/)那样,`if "%~1"==""`将是首选方法。 (2认同)

dcp*_*dcp 12

尝试用引号括起来:

if "%1"=="" (
    echo "nothing was passed"
) else (
    echo "a parameter was passed"
    dir
)
Run Code Online (Sandbox Code Playgroud)

你可以把回声拿出来,我只是把它们放在那里用于教育目的.