通过批处理文件

时间:2017-09-12 18:02:21

标签: xml windows batch-file search replace

我有一些xml文件(大约100个,一些在子文件夹中),其ID需要更改。因此,我有一个大约1.100行的Excel列表,左列是旧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的某些内容可能有误?任何帮助将非常感谢!

1 个答案:

答案 0 :(得分:0)

可能有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

Additinally:

  • 如果您的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')