【问题标题】:Batch, use wildcard in set批处理,在集合中使用通配符
【发布时间】:2017-04-28 18:53:54
【问题描述】:

我想放一个批处理文件来修改 GPO 文件中的一行。

我遇到的问题是每个用户的路径都不同。

所以,我尝试在路径中使用通配符,但它不起作用。

这个蝙蝠正在工作:

@echo off &setlocal
setlocal enabledelayedexpansion

set "search=test"
set "replace=test2"
set "textfile=%appdata%\Thunderbird\Profiles\5xu9scdm.default\prefs.js"
set "newfile=%appdata%\Thunderbird\Profiles\5xu9scdm.default\prefs2.js"
(for /f "delims=" %%i in (%textfile%) do (
  set "line=%%i"
  set "line=!line:%search%=%replace%!"
  echo(!line!
))>"%newfile%"
del %textfile%
rename %newfile% prefs.js
endlocal

但如果我在集合中使用通配符,它​​就不再起作用了。

@echo off &setlocal
setlocal enabledelayedexpansion

set "search=test"
set "replace=test2"
set "textfile=%appdata%\Thunderbird\Profiles\*.default\prefs.js"
set "newfile=%appdata%\Thunderbird\Profiles\*.default\prefs2.js"
(for /f "delims=" %%i in (%textfile%) do (
  set "line=%%i"
  set "line=!line:%search%=%replace%!"
  echo(!line!
))>"%newfile%"
del %textfile%
rename %newfile% prefs.js
endlocal

我该如何解决这个问题?

【问题讨论】:

  • 通配符只能用在路径的最后一个元素中。
  • for /F 无法解析,因此您需要环绕for /D 循环来执行此操作...

标签: batch-file set wildcard


【解决方案1】:

您的方法不起作用,因为通配符只能出现在路径的最后一个元素中。此外,for /F 无法处理通配符。所以你需要环绕一个for /D循环来解析通配符,就像这样(假设只有一个匹配的目录*.default):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "search=test"
set "replace=test2"
set "rootdir=%appdata%\Thunderbird\Profiles\*.default"
set "textfile=prefs.js"
set "newfile=prefs2.js"

for /D %%j in ("%rootdir%") do (
    > "%%~j\%newfile%" (
        for /F "usebackq delims=" %%i in ("%%~j\%textfile%") do (
            set "line=%%i"
            setlocal EnableDelayedExpansion
            set "line=!line:%search%=%replace%!"
            echo(!line!
            endlocal
        )
    )
    > nul move /Y "%%~j\%newfile%" "%%~j\%textfile%"
)

endlocal
exit /B

除了插入for /D 循环之外我所做的更改:

  • 延迟扩展在循环内切换,因此文本文件中的感叹号不会丢失;
  • 所有路径都被正确引用;要在for /F 中使用带引号的文件路径,需要usebackq
  • 用修改后的文件替换原始文件是通过单个move 命令完成的,而不是del 加上rename

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多