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

30

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

if %1==. dir

基本上,如果你将以上代码放在dodir.bat中,并在不传递任何参数的情况下单独运行它,它将运行dir命令。但是,如果你传递任何参数,它将不会运行dir命令。

我似乎无法在我的Windows 7批处理文件中使其工作。也许我不记得正确的语法了。有任何帮助者吗?


一个“万能”的例子:https://dev59.com/AnRA5IYBdhLWcg3wyBD1#34552964 - user257319
3个回答

70

if %1.==. dir 如果参数包含像 ", < 等各种符号,将会出现问题。

if "%1"=="" 如果参数包含引号 (") 将会出现问题。

使用 if "%~1"=="" 代替:

if "%~1"=="" (
    echo No parameters have been provided.
) else (
    echo Parameters: %*
)

这应该适用于所有版本的Windows和DOS。

单元测试:

C:\>test
No parameters have been provided.

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

2
你能详细说明或提供一个关于 %~1 的参考吗? - Josejulio
1
@josejulio 你可以执行“call /?”来获取关于参数的所有花式功能的详细信息。对于%~1,它表示: 展开%1并删除任何周围的引号(“) - Tolga

25

其实过去它是这样写的:if %1.==. command(注意%1后面的点号)。并且在Windows 7中现在也可以使用,应该能够正常工作。

示例用法:

if %1.==. (
    echo No parameters have been provided.
) else (
    echo Parameters:
    echo %*
)

句点代表什么? - Rishabh Bhatnagar
2
@RishabhBhatnagar:我认为它并没有特定的含义。它只是为了避免当%1为空字符串时出现语法错误。它可以是其他字符,事实上,我曾经看到过其他字符被使用(例如if %1A==A),但是在这种特定模式中,“.”可能是最常用的。请注意,这种模式在过去、在DOS时代非常流行。现在,像Tolga建议的那样if "%~1"==""是首选方法。 - Andriy M

15

尝试用引号括起来:

if "%1"=="" (
    echo "nothing was passed"
) else (
    echo "a parameter was passed"
    dir
)

你可以删掉这些echo,我只是为了教育目的而放置它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接