批量,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
命令完成的,而不是 del
加 rename
;
我想放一个批处理文件来修改 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
命令完成的,而不是del
加rename
;