0

お時間をいただきありがとうございます。

私は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」値を選択して変数に入れ、「Image」値を置き換えることです。説明するよりも、意図した出力を表示する方がおそらく簡単です!

OrderLine="0002" <Image>11770060002.pdf</Image>
OrderLine="0003" <Image>11770060003.pdf</Image>

ご覧のとおり、ファイル名は置き換えられており、名前の末尾は OrderLine と同じです。ファイル内のオーダー ラインは 1 つだけの場合もあれば、150 の場合もありますが、ルールは常に同じです。

XML のように見えることはわかっていますが、有効ではない (聞かないでください) ため、そのままでは解析されず、テキスト ベースのソリューションである必要があります。

どんな助けでも感謝します!

編集:これは私がこれまでに持っているものです。これは機能しますが、ファイル名(ファイルの最初のエントリ、つまり0001と同じ)から値を取得するため、単一の注文のファイルでのみ機能します。上記のように、複数の OrderLine エントリに対処するためにルーチンを更新する必要があります。

$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
}
4

2 に答える 2

0

成功!mjolinor の助けがなければ、私はそれを成し遂げることができなかったので、時間を割いて助けてくれてありがとう、本当に感謝しています.

最後に、1 つを置き換えて実行し、もう 1 つを実行することで問題を解決しました。true/false を出力していたのは match ステートメントであり、それを回避するスキルがありませんでした。この方法は最もきれいではありませんが、仕事は完了しました:

$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 $_ }
于 2013-04-04T09:15:08.253 に答える
0

正規表現の使用:

一致させる必要がある行の 1 つから始めます。

OrderLine="0002" 11770060002_outside.jpg11770060002_inside.jpg

可変部分を正規表現のメタ文字に置き換えます。この場合、変数データは数字です。

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

次に、保持したい部分にグループ化括弧を追加します。

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

次に、-match を使用して正規表現に一致する行を除外し、キャプチャ グループへの後方参照を使用して -replace を使用してトリミングを行い、別の置換を使用してテキストのリテラル部分を置き換え、結果を別のファイルに出力します。

(get-content file.txt) -match $regex -replace $regex,'$1' -replace '_outside\.jpg','.pdf' |
 set-content newfile.txt
于 2013-04-03T12:28:16.147 に答える