批量,set中使用通配符

Batch, use wildcard in set

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

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

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

这个蝙蝠正在工作:

@echo off &setlocal
setlocal enabledelayedexpansion

set "search=test"
set "replace=test2"
set "textfile=%appdata%\Thunderbird\Profilesxu9scdm.default\prefs.js"
set "newfile=%appdata%\Thunderbird\Profilesxu9scdm.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 循环来解析通配符,就像这样(假设只有一个匹配目录 *.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 命令完成的,而不是 delrename;