【发布时间】:2018-02-21 07:07:41
【问题描述】:
我有一些需要更改 ID 的 xml 文件(大约 100 个,一些在子文件夹中)。因此,我有一个大约 1.100 行的 Excel 列表,左列是旧 ID 名称,右列是应该替换旧 ID 的新名称。
我在 Stackoverflow 上找到了这个脚本(并稍作修改):
@rem replaceids.bat
ECHO off
SETLOCAL enabledelayedexpansion
SET source=%1
SET target=%2
IF EXIST %target% DEL /f %target%
FOR /f "delims=" %%i IN ('FINDSTR . %source%') DO (
SET line=%%i
SET line=!line:ö=oe!
SET line=!line:ä=ae!
SET line=!line:ü=ue!
ECHO !line! >> %target%
)
这是原始链接: batch replace multiple different strings
然后我创建了另一个批处理文件来调用上面的批处理文件并在我的文件中运行它:
for /R %%F in (*.xml) do (
replaceids.bat "%%~dpnxF" "C:\mytargetfolder%%~pnxF"
)
在 Stackoverflow 上也找到了这个;这是链接: Batch process all files in directory
还要感谢 reddit 的 Meltz014,他帮助我走到了这一步。
我现在遇到的问题是,当我启动它时,它说找不到网络路径(不确定它用英语准确地说什么,因为我现在不在办公室并在德语 Windows 上运行它)。据我所知,我没有引用任何网络。
任何帮助将不胜感激。
顺便说一句,我的命令行经验非常有限。
编辑
我刚刚发现了一些可能让我更接近的东西,但它仍然不起作用: How to Find Replace Multiple strings in multiple text files using Powershell
$Iteration = 0
$FDPATH = 'D:\opt\HMI\Gfilefind_rep'
#& 'D:\usr\fox\wp\bin\tools\fdf_g.exe' $FDPATH\*.fdf
$GraphicsList = Get-ChildItem -Path $FDPATH\*.g | ForEach-Object FullName
$FindReplaceList = Import-Csv -Path $FDPATH\Input.csv
foreach($Graphic in $Graphicslist){
Write-Host "Processing Find Replace on : $Graphic"
foreach($item in $FindReplaceList){
Get-Content $Graphic | ForEach-Object { $_ -replace "$($item.FindString)", "$($item.ReplaceString)" } | Set-Content ($Graphic+".tmp")
Remove-Item $Graphic
Rename-Item ($Graphic+".tmp") $Graphic
$Iteration = $Iteration +1
Write-Host "String Replace Completed for $($item.ReplaceString)"
}
}
它似乎在做某事,但完成后它总是说
字符串替换已完成
我的 CSV 文件按照示例中的方式创建,这意味着:
FindString ReplaceString
AA1A 171PIT9931A
BB1B 171PIT9931B
etc..
由于它没有找到任何东西,我认为 CSV 可能有问题?任何帮助将不胜感激!
【问题讨论】:
-
您需要一种不同的方法来处理通常存在于 xml 文件中的所有
<>。您对行内容的所有未引用处理都将被解释为输入/输出重定向。您还应该检查 xml 文件具有什么编码 - UTF8/UTF16 将与纯批处理有问题。 -
它是 UTF-8。你会推荐什么方法? @LotPings
标签: xml windows batch-file search replace