【问题标题】:Splitting string using delayed expansion limitation使用延迟扩展限制拆分字符串
【发布时间】:2012-11-23 12:27:16
【问题描述】:

在测试脚本时,我在尝试使用批处理从字符串中提取字符时遇到了这个问题。我已将其简化为一个简单的示例。 t.txt 只包含单词hello

@echo off
setlocal enabledelayedexpansion
set a=0
set b=1
for /f %%a in (t.txt) do (
set x=%%a
echo !x:~!a!,!b!!
set /a x+=1
)
pause >nul

问题是,变量x需要使用延迟扩展来访问,因为我正在通过循环更新ab的值,这些也需要使用延迟扩展来访问。

当尝试使用变量ab 来拆分字符串时,它们都需要延迟扩展,但是! 标记的顺序意味着它没有按照我的意图进行解析!

CMD 会将我的命令扩展为!x:~!!,!!!,而不是先扩展内部命令。显然我也不能使用%

我发现解决此问题的唯一方法是调用不在循环中的外部函数,因此我可以使用%'s。

@echo off
setlocal enabledelayedexpansion
set a=0
set b=1
set v=
for /f %%a in (t.txt) do (
set x=%%a
call :RETURN x
set /a x+=1
)
pause >nul

:RETURN
set v=%1
echo %v:~!a!,!b!%

有没有什么方法可以让 cmd 以我需要的方式解析我的命令,或者这只是我必须使用call 的限制?

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    只需将变量 ab 传递给 FOR 变量。

    @echo off
    setlocal enabledelayedexpansion
    set a=0
    set b=1
    for /f %%a in (t.txt) do (
      set "x=%%a"
      for /f "tokens=1,2" %%A in ("%a% %b%") do echo !x:~%%A,%%B!
      REM this line makes no sense if x=hello: set /a x+=1
    )
    pause >nul
    

    【讨论】:

    • 甚至这也太复杂了
    【解决方案2】:

    混合延迟和正常扩展将起作用。

    @echo off
    setlocal EnableDelayedExpansion
    set a=0
    set b=1
    for /f %%L in (t.txt) do (
      set "x=%%L"
      echo !x:~%A%,%B%!
    )
    

    【讨论】:

    • +1:是的。我想到了这一点,但我认为 OP 有正当理由不能使用立即扩展。这个问题暗示示例代码是一个简化,我认为这不是一个很好的例子。
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多