Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理,在集合中使用通配符_Batch File_Set_Wildcard - Fatal编程技术网

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

Batch file 批处理,在集合中使用通配符,batch-file,set,wildcard,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 "ne

我想在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
循环来解析通配符,如下所示(假设只有一个匹配的目录
*。默认值
):

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置“搜索=测试”
设置“replace=test2”
设置“rootdir=%appdata%\Thunderbird\Profiles\*.default”
设置“textfile=prefs.js”
设置“newfile=prefs2.js”
对于“%rootdir%”中的/D%%j,请执行以下操作(
>“%%~j\%newfile%”(
对于/F“usebackq delims=“%%i in”(“%%~j\%textfile%”)do(
设置“行=%%i”
setlocal EnableDelayedExpansion
设置“行=!行:%search%=%replace%”
回声(!线!
端部
)
)
>nul move/Y“%%~j\%newfile%”“%%~j\%textfile%”
)
端部
退出/B
除了插入
for/D
循环之外,我还更改了什么:

  • 延迟扩展在循环中切换,因此文本文件中的感叹号不会丢失
  • 所有路径均正确引用;若要在
    中为/F
    使用带引号的文件路径,需要使用
    usebackq
  • 通过单个
    move
    命令替换原始文件,而不是
    del
    rename

通配符只能在路径中的最后一个元素中使用。而
for/F
无法解析,因此需要围绕
for/D
循环执行此操作…请参阅: