我需要输出OLD_ENTRY内容的前X个字符,比如33个字符。我用另一个脚本获取了字符数。是什么,在Windows cmd脚本的以下命令中,使用变量(例如POS)而不是硬编码值33的正确语法?
echo %OLD_ENTRY:~0,33%
感谢您的帮助,
翻录
答案 0 :(得分:1)
好吧,我倾向于称之为“嵌套变量”。无论如何,要扩展这样的嵌套变量,您需要建立第二个解析或扩展阶段,并且需要确保内部变量(POS
)首先扩展 ,而外部变量 (OLD_ENTRY
)在第二个阶段展开。有一些选择:
使用call
:
此选项可避免delayed variable expansion,这可能会导致文字!
符号出现问题,但速度非常慢,并且会引用^
个字符加倍:
在命令提示符窗口中:
call echo %^OLD_ENTRY:~0,%POS%%
这看起来像是“转义”(^
)外部变量,但实际上,这与真正的转义无关。在命令提示符下,未定义的变量不会被空字符串替换,它只是字面上保留。因此,在第一遍中,简单地保留未定义的变量^OLD_ENTRY
(您可以通过set "^OLD_ENTRY=something"
定义这样的变量来验证),在{{之后)跳过对结束%
的扫描1}}对于未定义的变量,奇怪的是,变量:
被扩展,最后一个(孤立的)%POS%
也被保留;在此阶段之后,会立即识别转义序列%
,从而生成文字^O
;所以我们得到O
,它在第二遍中被扩展。
在批处理文件中:
echo %OLD_ENTRY:~0,33%
在第一遍中,前两个连续百分比符号被一个文字call echo %%OLD_ENTRY:~0,%POS%%%
符号替换,变量%
被扩展,其余两个连续百分比符号被一个文字{{替换1}}也是签名,所以我们有%POS%
,在第二次传递中会扩展。
我认为这是更好的选择,因为它更快且不会混淆%
:
echo %OLD_ENTRY:~0,33%
此选项适用于命令提示符窗口和批处理文件。这里第一遍是正常/立即扩展(^
),它处理echo !OLD_ENTRY:~0,%POS%!
变量,因此第二遍传递延迟扩展(%
)接收%POS%
进行扩展。
另请参阅此帖:How does the Windows Command Interpreter (CMD.EXE) parse scripts?