【问题标题】:windows batch escape whole stringwindows批量转义整个字符串
【发布时间】:2020-07-08 16:49:30
【问题描述】:

好的。这是一个自我更新的批处理文件。我只是从一个更大的文件中简化了问题。
这是一个 Windows 批处理文件 (.bat),在执行时应自行打开并更新第一行

SET variableName=D:\Data
setlocal enableextensions enabledelayedexpansion
set /A i=0
for /f "tokens=*" %%f in ('type "%0"^&cd.^>"%0"') do (
  set /A i=!i!+1
  if !i! EQU 1 (
    echo SET variableName=D:\Data2>>%0
  ) else (
    echo %%f>>%0
  )
)
endlocal

所以让我们解释一下情况。 我在 5 和 6 行中有 !i! 变量。执行此文件后,每行中的变量将替换为行号。这显然是因为 echo %%f>>%0 无法忽略和转义变量。 我的问题是如何解决这个问题? 另一个较小的问题是上面的代码忽略了行首的空格(缩进)并生成一个平面文件。 执行这个文件的结果是:

SET variableName=D:\Data2
setlocal enableextensions enabledelayedexpansion
set /A i=0
for /f "tokens=*" %%f in ('type "%0"^&cd.^>"%0"') do (
set /A i=5+1
if 6 EQU 1 (
echo SET variableName=D:\Data2>>%0
) else (
echo %%f>>%0
)
)
endlocal

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    在执行文件时停止变量扩展就像在更新文件的行之前关闭延迟扩展一样简单,并将其与 endlocal 配对。

    通过在 For 循环选项中包含 delims= 来实现保留空格/制表符格式。

    Set variableName=D:\Data
    Setlocal enableextensions enabledelayedexpansion
    Set /A i=0
    For /f "tokens=* delims=" %%f in ('type "%0"^&cd.^>"%0"') do (
      Set /A i+=1
      If !i! EQU 1 (
        Echo SET variableName=D:\Data2>>%0
      ) Else (
        Setlocal DisableDelayedExpansion
        Echo(%%f>>%0
        Endlocal
      )
    )
    Endlocal
    

    【讨论】:

      【解决方案2】:
      set "variableName=D:\Data"
      setlocal enableextensions enabledelayedexpansion
      rem !test! exclaimations, %test% percentages
      
      for /f "skip=1 delims=" %%A in ('
          type "%~f0" ^&
          ^> "%~f0" echo set "variableName=D:\Data2"
      ') do (
          setlocal disabledelayedexpansion
          >> "%~f0" echo %%A
          endlocal
      )
      endlocal
      

      您可以避免计数,因为skip=1 可用于跳过第一行。使用delims= 来避免分隔线。 tokens=* 忽略行首的分隔符并获取行的其余部分,以便可以在此任务中省略。

      新的第一行现在位于for 循环命令中,而不是将文件擦除为空。如果您echo 更多行,则增加skip 数字。

      还可能需要使用setlocal disabledelayedexpansion,以便保留感叹号。

      修改正在读取的同一文件可能存在风险,但我假设您了解风险。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2017-04-12
        • 2020-07-31
        • 2015-01-17
        相关资源
        最近更新 更多