【问题标题】:Windows Shell Scripting: Check for batch options containing double quotesWindows Shell 脚本:检查包含双引号的批处理选项
【发布时间】:2010-12-23 02:37:02
【问题描述】:

尊敬的专家您好!

我想在我的批处理脚本中检查参数(或参数)刺痛的存在:

if "%*"=="" findstr "^::" "%~f0"&goto :eof

如果没有参数用双引号括起来,这很好用。例如:

test.bat par1 par2 ... --- works

但是

test.bat "par 1" par2 ... --- fails

我的问题是:

1) 有没有办法克服这个问题,而不是要求使用非双引号符号来指定“长”参数,然后使用字符串替换?

2) 我可以使用“if”来比较两个同时包含双引号和空格的字符串吗?

非常感谢您及时明确的答复。

【问题讨论】:

  • 在什么情况下不起作用?您预计会发生什么以及会发生什么?

标签: windows batch-file arguments quotes space


【解决方案1】:

由于安德烈的答案未能正确计算参数,这是一种有效的方法,即使有超过 9 个参数(它甚至保留原始参数,所以%1 仍然通过移动 @987654322 指向第一个参数@ing 进入子程序):

@echo off
call :get_num_args %*
echo %NumArgs%
goto :eof

:get_num_args
  set NumArgs=0
  :loop
  if not [%1]==[] (set /a NumArgs+=1) else (goto :eof)
  shift
  goto loop
goto :eof

【讨论】:

    【解决方案2】:

    谢谢你,安德烈斯。 这里还有两段代码来检查传递参数的存在和数量:

    set ArgumentString=%*
    if not defined ArgumentString findstr "^::" "%~f0"&goto :eof
    if "%ArgumentString:"=%"=="" findstr "^::" "%~f0"&goto :eof
    

    set NumberOfArguments=0
    for /l %%N in (1,1,9) do (
      call set CurrentArgument=%%%%N
      if defined CurrentArgument set /a NumberOfArguments += 1
    )
    if %NumberOfArguments% NEQ %N% findstr "^::" "%~f0"&goto :eof 
    

    这里的变量 N 包含所需的参数个数。

    希望这对某人有所帮助!

    【讨论】:

    • 后一种方式在超过 9 个参数的情况下无法正确计数。
    • 谢谢你,约翰内斯!但是,您的方法无法正确处理带有空格的参数,例如“aaa bbb”...
    【解决方案3】:

    ~会去掉双引号,但对%*不起作用,但如果你只是想知道有没有参数,只检查%1就足够了

    if "%~1"==""
    

    您可能需要先调用 setlocal ENABLEEXTENSIONS 以确保扩展已打开(~ 需要)

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多