批处理,在集合中使用通配符

时间:2017-04-28 18:53:54

标签: batch-file set wildcard

我想放一个批处理文件来修改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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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命令完成的,而不是delrename;