cd コマンドで mainDir 階層に移動し、次のコマンドを実行してみてください。
PowerShell
1Get-ChildItem | Where-Object { $_.Name -match '^\d+_(.+)グループ_(.+)店' }
これで求められるディレクトリを列挙できます。
Get-ChildItem
はそのディレクトリにあるファイルやディレクトリを列挙するコマンドレットで、その出力である System.IO.FileSystemInfo
の集合を Where-Object
に渡しています。
Where-Object
は与えられた入力に対し、続くスクリプトブロックの出力が $true
であるもののみ出力します。
この場合は Get-ChildItem
の出力である System.IO.FileSystemInfo
の Name
プロパティが続く正規表現に合致している時に $true
を出力し、していないときに $false
を出力します。
^\d+_(.+)グループ_(.+)店
が正規表現です。^
は文字列の先頭にマッチし、\d
は数字一文字に、+
は直前の正規表現の一回以上の繰り返しにマッチします。ここまでで、「先頭から続く数字の一文字以上の繰り返し」になります。
また .
はすべての文字に一致し、.+
は「すべての文字の一回以上の繰り返し」にマッチします。これをカッコでくくっているのは、後で取り出すことができるようにするためです。たとえば次のように書いてみてください。
PowerShell
1Get-ChildItem | Where-Object { $_.Name -match '^\d+_(.+)グループ_(.+)店' } | Foreach-Object { [pscustomobject]@{グループ = $Matches[1]; 店 = $Matches[2]} }
これについては脇道なので詳しくは説明しませんが、グループ名と店名が列挙されたはずです。
発見されたディレクトリの中の a.txt
の末尾に 123456
を追加するには次のようにします。
PowerShell
1Get-ChildItem | Where-Object { $_.Name -match '^\d+_(.+)グループ_(.+)店' } | Foreach-Object { Add-Content -LiteralPath ($_ | Get-ChildItem -Include 'a.txt') '123456' }
Foreach-Object
は与えられた入力に対して繰り返しスクリプトブロックの処理を行うコマンドレットです。与えられた個々の入力は $_
という特殊な変数に代入されています。
ここで $_
は発見したディレクトリを表す System.IO.FileSystemInfo
なので、$_ | Get-ChildItem -Include 'a.txt'
はそのディレクトリの中の a.txt
を表す System.IO.FileSystemInfo
を出力します。
それを Add-Content
の -LiteralPath
に渡しています。
Add-Content
は特定のファイルの末尾に与えられたデータを追加するコマンドレットなので、これで追記できるということです。
もし、望む編集が追記ではなく一部の置換だとしたら、Add-Content
は使えません。次のように、まず元のファイルの名前を変更し、その中身を置換したものを元のファイル名で出力するのが良いと思います。
PowerShell
1Get-ChildItem | Where-Object {
2 $_.Name -match '^\d+_(.+)グループ_(.+)店'
3} | Get-ChildItem -Include 'a.txt' | Foreach-Object {
4 $backup = $_.FullName + '.bak'
5 if (Test-Path -LiteralPath $backup) {
6 Remove-Item -LiteralPath $backup
7 }
8 Copy-Item -LiteralPath $_ -Destination $backup
9 Get-Content -LiteralPath $backup | Foreach-Object {
10 $_ -replace '1', '一' # この $_ は Get-Content の出力であるファイルの中身を指す
11 } | Set-Content -LiteralPath $_ # この $_ は Get-ChildItem -Include 'a.txt' の出力であるファイルシステムオブジェクトを指す
12}
書き換え部分については脇道なので詳細に説明しませんが、ファイル中の 1
を 一
に書き換えています。テスト用のフォルダとファイルを作成し、上記コマンドで 1
が 一
になることがわかったらこの問題は解決済みにしてください。中身の書き換えの詳細についてはまた別の質問だと思います。
なお、わからないコマンドの詳細については Get-Help Get-ChildItem
のように Get-Help
コマンドを使ってください。
また、-LiteralPath
を多用していますが、これはファイル名をそのまま使用するオプションです。-LiteralPath
を省略すると、代わりに -Path
オプションが使われますが、このオプションは一部の文字がワイルドカードとして認識されるので、思わない結果になることがあります。ワイルドカードが必要なとき以外は必ず -Literalpath
を使いましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/04 02:12 編集
2020/09/04 02:16 編集
2020/09/04 03:58
退会済みユーザー
2020/09/05 07:10