如何从批处理文件中的脚本参数中删除引号?

时间:2016-03-21 01:04:38

标签: windows batch-file cmd windows-10 command-prompt

假设您正在编写一个批处理脚本,您希望从该字符串中删除字符串中的引号。

如果字符串存储在常规Batch变量中,您可以这样做:

set name="John"
echo %name:"=%

如果字符串存储在位置参数中,您可以这样做:

echo %~1

你将如何为脚本参数实现相同的效果,特别是%*变量?当我尝试使用我用于位置参数的相同表示法时,我得到了这个:

> echo echo %~* > script.cmd

> script "123" "456"
The following usage of the path operator in batch-parameter
substitution is invalid: %~* 


For valid formats type CALL /? or FOR /?
script was unexpected at this time.

我该如何使这项工作?我有什么特别的语法,我不知道吗?任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:5)

  

假设您正在编写一个批处理脚本,您希望从该字符串中删除字符串中的引号。

     

如果字符串存储在常规Batch变量中,您可以这样做:

     

set name="John"
      echo %name:"=%

您的断言不正确。使用字符串值时更好的约定始终是引用set "variable=value"对的"variable=value",然后在检索时需要显式添加引号,而不是赋值。例如:

@echo off
setlocal

set "xml=<node>Text</node>"
for /f "tokens=2 delims=<>" %%I in ("%xml%") do echo Text: %%I

因此,引号不包含在变量值中,但引用的任何特殊字符都避免被不恰当地解释。虽然这不是你所要求的,但它仍然是一个值得练习的基本惯例。

  

如果字符串存储在位置参数中,您可以这样做:

     

echo %~1

     

你将如何为脚本参数实现相同的效果,特别是%*变量?

是的,您可以对带有数字索引的单个参数使用波浪符号表示法,但不能对%*集合使用波浪符号表示法。要解决您的谜题,您必须使用%*for...in循环遍历shift...gotofor...in是更有效的选择。这是工作解决方案的一百条可能路径之一。

@echo off
setlocal enabledelayedexpansion

set "argv[0]=%~0"
set idx=1

for %%I in (%*) do (
    set "argv[!idx!]=%%~I"
    set /a ubound = idx, idx += 1
)

for /L %%I in (0,1,%ubound%) do echo %%I: !argv[%%I]!

rem // or you could also:
rem // set argv[