PowerShell将根据内容替换文本文件中的多个元素

PowerShell将根据内容替换文本文件中的多个元素,powershell,powershell-3.0,Powershell,Powershell 3.0,提前感谢您抽出时间 我是PowerShell的新手,尝试编写一个脚本,可以搜索一堆文本文件并选择某些元素,然后使用这些元素替换其他元素。以下是内容示例: OrderLine="0002" <Image>11770060002_outside.jpg</Image><Image>11770060002_inside.jpg</Image> OrderLine="0003" <Image>11770060003_outside.jpg<

提前感谢您抽出时间

我是PowerShell的新手,尝试编写一个脚本,可以搜索一堆文本文件并选择某些元素,然后使用这些元素替换其他元素。以下是内容示例:

OrderLine="0002" <Image>11770060002_outside.jpg</Image><Image>11770060002_inside.jpg</Image>
OrderLine="0003" <Image>11770060003_outside.jpg</Image><Image>11770060003_inside.jpg</Image>
OrderLine=“0002”117700002\u外部.jpg11770060002\u内部.jpg
OrderLine=“0003”11770003\u外部.jpg11770060003\u内部.jpg
因此,我要做的是分步进行,选择“OrderLine”值并将其放入变量中,然后替换“Image”值-仅显示预期输出可能比尝试解释更容易

OrderLine="0002" <Image>11770060002.pdf</Image>
OrderLine="0003" <Image>11770060003.pdf</Image>
OrderLine=“0002”11770002.pdf
OrderLine=“0003”11770003.pdf
如您所见,文件名已被替换,名称的结尾与订单行相同。文件中可能只有一个订单行,也可能有150个订单行,但规则始终相同

我知道它看起来像XML,但它是无效的(不要问),所以它不会这样解析,需要一个基于文本的解决方案

感谢您的帮助

编辑:这是我到目前为止得到的,它可以工作,但它从文件名中获取值(与文件中的第一个条目相同,即0001),因此它只适用于具有单个顺序的文件。我需要更新例程以处理多个订单行条目,如上所述

$File_Folder = "C:\PSTEST\TEST\"
$Output_Folder = "C:\PSTEST\TEST\OUTPUT\"

$array = Get-ChildItem $File_Folder\*.xml

foreach($item in $array){

$xml_filename = $item.FullName.substring($File_Folder.Length)

$just_filename = $xml_filename -replace ".xml", ""
$just_filename = $just_filename -replace "Order_PO", ""

$replace_outside_original = '<image>' + $just_filename + '_outside.jpg</Image>'
$replace_outside_with = '<image>' + $just_filename + '.pdf</image>'

$replace_inside_original = '<image>' + $just_filename + '_inside.jpg</Image>'
$replace_inside_with = ''

$destination_file = $Output_Folder + 'Order_PO' + $just_filename + '.xml'

(Get-Content $File_Folder\$xml_filename) | Foreach-Object {
    $_ -replace $replace_outside_original, $replace_outside_with `
       -replace $replace_inside_original, $replace_inside_with `
    } | Set-Content $destination_file
}
$File\u Folder=“C:\PSTEST\TEST\”
$Output\u Folder=“C:\PSTEST\TEST\Output\”
$array=Get ChildItem$File\u Folder\*.xml
foreach($数组中的项){
$xml\u filename=$item.FullName.substring($File\u Folder.Length)
$just_filename=$xml_filename-replace.xml“
$just_filename=$just_filename-替换“订单”
$replace_outside_original=''+$just_filename+''u outside.jpg'
$replace_outside_为=''+$just_filename+'.pdf'
$replace_inside_original=''+$just_filename+''u inside.jpg'
$replace_in_为=“”
$destination_file=$Output_Folder+'Order_PO'+$just_filename+'.xml'
(获取内容$File_文件夹\$xml_文件名)|每个对象{
$\将$replace\u替换为原始版本以外的版本,$replace\u替换为`
-替换$replace_in_original,$replace_in_with`
}|设置内容$destination_文件
}
使用正则表达式:

从需要匹配的行之一开始:

OrderLine=“0002”117700002\u外部.jpg11770060002\u内部.jpg

用regex元字符替换变量部分。在这种情况下,变量数据为数字:

$regex  = 'OrderLine="\d+" <Image>\d+_outside.jpg</Image><Image>\d+_inside.jpg</Image>'

成功!如果没有mjolinor的帮助,我不可能做到这一点。非常感谢你抽出时间来帮助我,我真的很感激

最后,我换了一个,然后运行了另一个,我认为是匹配语句输出了真/假,我没有技能解决这个问题。这种方式不是最干净的,但它完成了任务:

$File_Folder = "C:\PSTEST\TEST\"
$regex  = '<Image>\d+_inside.jpg</Image>'
$array = Get-ChildItem $File_Folder\*.xml | ForEach-Object { (Get-Content $_) -replace '_outside\.jpg','.pdf' | Set-Content -path $_ }
$array = Get-ChildItem $File_Folder\*.xml | ForEach-Object { (Get-Content $_) -replace $regex,'' | Set-Content -path $_ }
$File\u Folder=“C:\PSTEST\TEST\”
$regex='\d+\u inside.jpg'
$array=Get ChildItem$File_Folder\*.xml | ForEach对象{(Get Content$|)-替换“_outside\.jpg”,“.pdf”|设置内容-路径$|
$array=Get ChildItem$File_Folder\*.xml | ForEach对象{(Get Content$|)-replace$regex',| Set Content-path$|

jpg文件名的最后几位是否始终与订单行匹配?从这个例子来看,这似乎只是一个简单的问题,用“.pdf”替换“_outside.jpg”,然后修剪掉最后一个图像元素。是的-我可以用substring单独完成这项工作,我可以创建一个“to replace”变量,并用一个空字符串替换它,但问题是我真的不知道如何读取OrderLine值,然后第二个问题是如何继续进行,直到我得到每一个条目。啊,@mjolinor我明白你的意思,对不起-是的,你是对的-理论上我可以用.pdf替换所有的_outside.jpg实例,但是我想不出一种方式来编程地说“并去掉第二个图像元素”,因为第一个和第二个图像元素的标签是相同的,所以简单的替换是不行的。谢谢@mjolinor-感谢你的帮助!我仍在努力将其放入一个循环中,该循环将逐步遍历订单行值,直到完成所有操作为止,但我会继续工作-我可能错过了一些明显的东西,因为我的大脑因为看了这几天而兴奋不已!你不应该需要一个循环。-match和replace操作符将同时在整个阵列上工作,因此您不需要跨线操作。我真的很难理解这一点,这是漫长的一天!我有一个包含原始样式行的文件名为file.txt,那么它是如何写入新文件的呢?当我尝试运行你说的行时,它只输出“False”或“True”。你需要使用out file或set content将输出发送到一个新文件。我将更新脚本。我不明白如果你在运行脚本,为什么会得到正确/错误的结果。注意:您只需要第二个$regex=行。第一个只是演示的起点。是的,下面是我要说的:$regex='(OrderLine=“\d+”\d+\u outside.jpg)\d+\u inside.jpg'$array=Get ChildItem$File\u Folder*.xml | ForEach对象{(Get Content$|)-匹配$regex-替换$regex,$1'-replace'outside\.jpg',.pdf''Set Content-path$}
(get-content file.txt) -match $regex -replace $regex,'$1' -replace '_outside\.jpg','.pdf' |
 set-content newfile.txt
$File_Folder = "C:\PSTEST\TEST\"
$regex  = '<Image>\d+_inside.jpg</Image>'
$array = Get-ChildItem $File_Folder\*.xml | ForEach-Object { (Get-Content $_) -replace '_outside\.jpg','.pdf' | Set-Content -path $_ }
$array = Get-ChildItem $File_Folder\*.xml | ForEach-Object { (Get-Content $_) -replace $regex,'' | Set-Content -path $_ }