一連の.txtファイル(正確には.hl7ファイルを検索するPowerShellスクリプトを作成しようとしていますが、これらのファイル内で4桁の数字が含まれているかどうかを調べることができます。ファイルに4桁の数字が含まれている場合は、元のファイル名の先頭に追加された文字列でファイルの名前を変更する必要があります。したがってtest.hl7は8000_test.hl7になります(ファイル内に4桁の数字が含まれている場合)。複数のファイルで文字列を検索し、その文字列でファイルの名前を変更します。
猛烈なグーグルでの一日を過ごした後や本サイトを通じて掘り、これは私が召集ことができる最高です:
$AccountIDs = ("8155", "8156", "8428")
$Path = "C:\Users\ThatsMe\Downloads\messages"
$Files = (Get-ChildItem $Path -Filter "*.hl7")
for ($i = 0; $i -le $Files.Length; $i++) {
if (Get-Content $Files[$i].FullName | Select-String -Pattern $AccountIDs[$i]) {
Rename-Item $Files[$i].FullName -NewName (($AccountIDs[$i]) + "_" + $Files[$i].Name)
}
}
私はいくつかの興味深い結果を得ています。私は現在、4つのテストというメッセージフォルダ内のファイル、テスト、test2は、TEST3、およびskibbidybopを持っています。最初のもの、テストは、8156_testに正しく変更されます。ただし、他のファイルには触れません。私はテスト t検定へのファイル名を変更したときに今、スクリプトは完全にそのファイルをスキップして、それぞれ8156_test2(間違っていた)と8428_test3にTEST2とTEST3の名前を変更します。 skibbidybopは決して触られません。
そして、もちろん、PowerShellのからのエラーメッセージ:
Select-String : Cannot bind argument to parameter 'Pattern' because it is null. At line:6 char:61 + if (Get-Content $Files[$i].FullName | Select-String -Pattern <<<< $AccountIDs[$i]) { + CategoryInfo : InvalidData: (:) [Select-String], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.SelectStringCommand Get-Content : Cannot bind argument to parameter 'Path' because it is null. At line:6 char:16 + if (Get-Content <<<< $Files[$i].FullName | Select-String -Pattern $AccountIDs[$i]) { + CategoryInfo : InvalidData: (:) [Get-Content], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetContentCommand
更新されたコード
$Path = "C:\Users\ThatsMe\Downloads\messages"
$pattern = '\b(8155|8156|8428)\b'
Get-ChildItem $Path -Filter '*.hl7' |
Select-String -Pattern $pattern |
Group-Object Path |
ForEach-Object {
$id = $_.Group.Matches[0].Groups[0].Value
$filename = $_.Group.Filename | Select-Object -First 1
Rename-Item -Path $_.Name -NewName "${id}_${filename}" -WhatIf
}
これは私が今受信エラーです:
C:\> C:\Users\ThatsMe\Downloads\messages\changename.ps1 Cannot index into a null array. At C:\Users\ThatsMe\Downloads\messages\changename.ps1:8 char:38 + $id = $_.Group.Matches[ <<<< 0].Groups[0].Value + CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException + FullyQualifiedErrorId : NullArray What if: Performing operation "Rename File" on Target "Item: C:\Users\ThatsMe\Downloads\messages\test.hl7 Destination: C:\Users\ThatsMe\Downloads\messages\_". Cannot index into a null array. At C:\Users\ThatsMe\Downloads\messages\changename.ps1:8 char:38 + $id = $_.Group.Matches[ <<<< 0].Groups[0].Value + CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException + FullyQualifiedErrorId : NullArray What if: Performing operation "Rename File" on Target "Item: C:\Users\ThatsMe\Downloads\messages\test3.hl7 Destination: C:\Users\ThatsMe\Downloads\messages\_".
あなたの答えは多くの視点に入り、私が間違っていた理由についての論理的な理由を理解する助けになりました。しかし、スクリプトを実行すると、次のエラーが表示されます。 'ヌル配列にインデックスできません。 C:... changename.ps1:8 char:38 + $ id = $ _。Group.Matches [<<<< 0] .Groups [0] .Value +カテゴリ情報:InvalidOperation:(0:Int32 )[]、RuntimeException + FullyQualifiedErrorId:NullArray' 「ファイルの名前の変更」操作を実行すると、「出力」の状態が発生します。スクリプトは正常に正しいファイルを見つけますが、それ以降はあまり効果がないようです。 – sabrobby
投稿したコードで説明したエラーを再現することはできません。空のソースフォルダと、0,1、および1以上の一致を生成するファイルを持つソースフォルダでテストされます。 –
ご協力いただきありがとうございます。実行しているPowerShellのバージョンで問題になるかもしれませんか? (バージョン2)。それにもかかわらず、私は先に進み、この質問を回答として提出する。 – sabrobby