假设您正在编写一个批处理脚本,您希望从该字符串中删除字符串中的引号。
如果字符串存储在常规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.
我该如何使这项工作?我有什么特别的语法,我不知道吗?任何帮助将不胜感激,谢谢!
答案 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...goto
。 for...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[