【问题标题】:Why does CALL SET work differently in a CMD Windows versus a .CMD file?为什么在 CMD Windows 和 .CMD 文件中 CALL SET 的工作方式不同?
【发布时间】:2017-03-19 22:51:41
【问题描述】:

我正在尝试以编程方式使用 Windows CMD SET 字符串操作版本。 SET的两个版本是……

SET New_String=%String:Old_Text=New_Text%

在变量String 中,将Old_Text 替换为New_Text,并在变量New_String 中返回结果。

SET New_String=%String:~Number_Of_Chars_To_Skip,Number_Of_Chars_To_Keep%

在变量String中跳过Number_Of_Chars_To_Skip后提取Number_Of_Chars_To_Keep,并在变量New_String中返回结果

Old_Text, New_Text, Number_Of_Chars_To_Skip, Number_Of_Chars_To_Keep 必须都是文字,而不是变量。所以,典型的用法是这样的......

SET New_String=%String:abcd=fghi%
SET New_String=%String:~2,4%

这样的用法是行不通的......

SET New_String=%String:%Old_Text%=%New_Text%%
SET New_String=%String:~%Skip_Count%,%Keep_Count%%

要做到以上两个SETs 你必须CALL SET,比如...

CALL SET New_String=%%String:%Old_Text%=%New_Text%%%
CALL SET New_String=%%String:~%Skip_Count%,%Keep_Count%%%

所以,我有以下测试代码片段...

SET "Chars=" & SET "String=0123456789" & SET "Skip=1" & SET "Keep=3"
CALL SET Chars=%%String:~%Skip%,%Keep%%%
ECHO Chars="%Chars%" (expected to be "123")

从 CMD 文件可以正常工作。 CALL 已扩展为 SET Chars=%string:~1,3% 并返回了预期结果 123。但是,一个很大的但它是,从 CMD 窗口(具有相同的变量)完全相同的 CALL SET 返回这个 ...

%0123456789Skip%,3%%

为什么这在 CMD 窗口中不起作用?我研究了一下,没有找到任何解释原因的信息。

【问题讨论】:

    标签: string windows cmd set


    【解决方案1】:

    根据线程How does the Windows Command Interpreter (CMD.EXE) parse scripts?,批处理文件和命令行的解析方式不同,尤其是在环境变量扩展方面。

    批处理文件解析器将两个连续的百分号替换为一个文字的百分号,而命令行解析器则不会。因此CALL SET Chars=%%String:~%Skip%,%Keep%%% 在批处理文件中有效,但在cmd 中无效。

    要在cmd 中获得相同的结果,您可以使用:

    CALL SET Chars=%^String:~%Skip%,%Keep%%
    

    实际上,这只是指定了一个名为^String 的变量,预计不会定义该变量。与批处理文件解析器相比,命令行解析器不会用空字符串替换未定义的变量,因此^String 会按字面意思保留。注意^ 是在% 变量扩展之后处理的。变量%Skip%%Keep% 按预期展开,因此结果表达式为SET Chars=%String:~1,3%

    为了证明这一点,只需执行SET String=something,因此结果将是ome


    请注意,引用 SET 语法 CALL SET "Chars=%^String:~%Skip%,%Keep%%" 失败,因为这会从解析器中隐藏转义字符 ^。但是,您可以改用转义引号:

    CALL SET ^"Chars=%^String:~%Skip%,%Keep%%^"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多