LoginSignup
1
4

More than 3 years have passed since last update.

バッチファイルをやめてPowerShellにするメモ

Last updated at Posted at 2020-04-10

はじめに

環境構築が要らないとはいえバッチファイルなんて書きたくない人のためメモです。
私見ですがおススメの理由は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ファイルだけを対象に処理を行う方法です。

参考にさせていただいたサイトはこちら

フォルダやファイルを取り出す

find.ps1
# チェックするフォルダのフルパス.
$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?でフィルタをかけ、欲しい名前のものだけを取り出しています。

あとはこれをループさせるだけです。

実際に作ったものとハマった部分

hogehogefind.ps1
# チェックするフォルダのフルパス.
$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 を追記いたしました)
run.bat
powershell -NoProfile -ExecutionPolicy Unrestricted -File .\hogehogefind.ps1
1
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4