在windows cmd文件中使用环境变量作为子字符串长度参数

时间:2018-04-04 12:52:11

标签: windows cmd substring

我需要输出OLD_ENTRY内容的前X个字符,比如33个字符。我用另一个脚本获取了字符数。是什么,在Windows cmd脚本的以下命令中,使用变量(例如POS)而不是硬编码值33的正确语法?

echo %OLD_ENTRY:~0,33%

感谢您的帮助,

翻录

1 个答案:

答案 0 :(得分:1)

好吧,我倾向于称之为“嵌套变量”。无论如何,要扩展这样的嵌套变量,您需要建立第二个解析或扩展阶段,并且需要确保内部变量(POS)首先扩展 ,而外部变量OLD_ENTRY)在第二个阶段展开。有一些选择:

  1. 使用call

    此选项可避免delayed variable expansion,这可能会导致文字!符号出现问题,但速度非常慢,并且会引用^个字符加倍:

    1. 在命令提示符窗口中:

      call echo %^OLD_ENTRY:~0,%POS%%
      

      这看起来像是“转义”(^)外部变量,但实际上,这与真正的转义无关。在命令提示符下,未定义的变量不会被空字符串替换,它只是字面上保留。因此,在第一遍中,简单地保留未定义的变量^OLD_ENTRY(您可以通过set "^OLD_ENTRY=something"定义这样的变量来验证),在{{之后)跳过对结束%的扫描1}}对于未定义的变量,奇怪的是,变量:被扩展,最后一个(孤立的)%POS%也被保留;在此阶段之后,会立即识别转义序列%,从而生成文字^O;所以我们得到O,它在第二遍中被扩展。

    2. 在批处理文件中:

      echo %OLD_ENTRY:~0,33%

      在第一遍中,前两个连续百分比符号被一个文字call echo %%OLD_ENTRY:~0,%POS%%% 符号替换,变量%被扩展,其余两个连续百分比符号被一个文字{{替换1}}也是签名,所以我们有%POS%,在第二次传递中会扩展。

  2. 使用delayed variable expansion

    我认为这是更好的选择,因为它更快且不会混淆%

    echo %OLD_ENTRY:~0,33%

    此选项适用于命令提示符窗口和批处理文件。这里第一遍是正常/立即扩展(^),它处理echo !OLD_ENTRY:~0,%POS%! 变量,因此第二遍传递延迟扩展(%)接收%POS%进行扩展。

  3. 另请参阅此帖:How does the Windows Command Interpreter (CMD.EXE) parse scripts?