はじめに
環境構築が要らないとはいえバッチファイルなんて書きたくない人のためメモです。
私見ですがおススメの理由は3つです。
- バッチファイルに比べて書きやすい(遅延環境変数とか考えなくて済む)
- Visual Studio Codeでデバッグできる
- 最悪メモ帳でも編集できる
複雑な処理は実行ファイル作った方がいい部分も多いので、上手く住み分けることが大切かなと思います。
この記事で紹介すること
hoge/
├ hoge1/
hoge1_1.txt
hoge1_2.txt
├ hoge2/
hoge2_1.txt
hoge2_2.txt
└ hoge3/
hoge3_1.txt
hoge3_2.txt
このような構成で_1.txt
ファイルだけを対象に処理を行う方法です。
参考にさせていただいたサイトはこちら
フォルダやファイルを取り出す
# チェックするフォルダのフルパス.
$searchPath = "***\hoge"
# hoge_*のフォルダ名取得(一応directoryに限定).
$dirPath = Get-ChildItem -Path $searchPath -Directory -Filter hoge?
# 出力.
Write-Host $dirPath[0].Name
Write-Host $dirPath[0].FullName
これを実行すると、
Name: hoge1
FullName: ***\hoge\hoge1
と出てくるので、Nameにフォルダ名, FullNameにそのパスが入ることがわかります。
参考サイトに記載されている通り-Filter hoge?
でフィルタをかけ、欲しい名前のものだけを取り出しています。
あとはこれをループさせるだけです。
実際に作ったものとハマった部分
# チェックするフォルダのフルパス.
$searchPath = "***\hoge"
# hoge_*のフォルダ名取得(一応directoryに限定).
$dirPath = @(Get-ChildItem -Path $searchPath -Directory -Filter hoge? )
for ($i = 0; $i -lt $dirPath.Length; $i++)
{
# _1,_2などのファイル名取得.
$textName = @(Get-ChildItem -Path $dirPath[$i].FullName -File -Filter hoge?_1.txt)
for ($j = 0; $j -lt $textName.Length; $j++)
{
Write-Host $textName[$j].FullName
}
}
基本的にはfind.ps1
をフォルダ, ファイルに対して実行するだけですが、$dirPath = @(Get-ChildItem -Path $searchPath -Directory -Filter hoge? )
だけ変更してあります。
こちらに記載されておりますがGet-ChildItem
はファイルが1つしか見つからなかった場合に配列を返してくれないので、$textName.Length
が0になってしまいfor文に入らないのです。
ファイル操作などを行う場合はWrite-Host
の部分をexeなどに変えて行うことができます。
追記
コメントにありますように配列にならない件はforeach
やパイプラインを使うことで解決できました!ありがとうございます!
おまけ
- PS1を実行するバッチ.(ご指摘いただき
-File
を追記いたしました)
powershell -NoProfile -ExecutionPolicy Unrestricted -File .\hogehogefind.ps1