【问题标题】:Search and replace multiple strings in multiple xml files via batch file通过批处理文件搜索和替换多个xml文件中的多个字符串
【发布时间】: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


【解决方案1】:

可能有 1 个命令行来帮助您的工作:(%a = old-id, %b = new-id)

for /f "tokens=1,2" %a in (ids-list.csv) do msr -rp dir1,dirN -f "\.xml$" -x "%a" -o "%b" -R

  • 如果要在更改文件之前预览结果,请删除-R

  • 如果您将上述命令放在文件中,请将 %a 替换为 %%a 并将 %b 替换为 %%b

不太明白你的问题。我认为最好告诉2点:

  • 您的意见是什么?
  • 您需要什么输出?

假设:

  • 您有一个源旧/新 ID 列表文件:ids-list.csv
  • 您想在文件夹中递归搜索和替换:dir1,dir2-N

msr.exe 是我打开的项目https://github.com/qualiu/msrtools 中的单个便携式exe 工具。您可以使用正则表达式替换 (-t) 代替纯文本 (-x) 和忽略大小写 (-i)。更多信息:https://qualiu.github.io/msr/usage-by-running/msr-Windows.html

另外:

  • 如果您的ids-list.csv, 分隔而不是空格,请使用:

    for /f "tokens=1,2 delims=," %a in (ids-list.csv)

  • 如果您的ids-list.csv 更复杂,例如: "old-id-1","new-id-1" "old-id-2","new-id-2"

    for /f "tokens=*" %a in ('msr -p ids-list.csv -t ".*\W(.+?)\W,\W(.+?)\W.*" -o "$1 $2" -PAC')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多