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

Jam*_* Ko 3 windows cmd batch-file command-prompt windows-10

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

如果字符串存储在常规Batch变量中,则可以执行以下操作:

set name="John"
echo %name:"=%
Run Code Online (Sandbox Code Playgroud)

如果字符串存储在位置参数中,则可以执行以下操作:

echo %~1
Run Code Online (Sandbox Code Playgroud)

您将如何实现脚本参数(尤其是%*变量)的相同效果?当我尝试使用与位置参数相同的符号时,得到以下信息:

> 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.
Run Code Online (Sandbox Code Playgroud)

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

roj*_*ojo 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
Run Code Online (Sandbox Code Playgroud)

因此,引号不包含在变量值中,但是引用的任何特殊字符都应避免被错误解释。即使这不是您真正要问的,它仍然是值得实践的基本约定。


如果字符串存储在位置参数中,则可以执行以下操作:

echo %~1

您将如何实现脚本参数(尤其是%*变量)的相同效果?

的确,您可以对带有数字索引的单个参数使用波浪号表示法,但不能对%*集合使用。要解决您的难题,您必须%*使用for...inshift...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[
Run Code Online (Sandbox Code Playgroud)