【PowerShell】フォルダ内にあるファイルを取得する方法

PowerShell

【PowerShell】フォルダ内にあるファイルを取得する方法

こんにちは!SE ブログの相馬です。

 

 

 

今回は、特定のフォルダ内にあるファイルを取得する方法について書いてみました。

 

 

スクリプトを書く時に、特定のフォルダの中にあるファイルの一覧を取得したい時や、一覧の中に特定の拡張子を持つファイル、例えば CSV ファイルがあるかどうか確認したい時があるかと思います。

 

 

また、ファイルを取得した後に一覧をテキストファイルに書き込んだり、ファイルを別の場所に移動したり、または Import-Csv コマンドレットでファイルを読み込んで ForEach-Object で繰り返し処理をしたい時があるかと思います。

 

 

そういう時にまずはファイルの一覧を取得するところから始めます。では早速始めましょう。

 

 

 

ファイルを取得する方法

 

 

Get-ChildItem コマンドレットを使います。試しに C:\Windows\System32 の中のファイルを取得してみましょう。かなり多く表示されます。

 

Get-ChildItem C:\Windows\System32


# 実行結果
ディレクトリ: C:\Windows\System32

Mode LastWriteTime Length Name 
---- ------------- ------ ---- 
d----- 3/19/31 15:20 0409 
d----- 3/19/31 13:53 AdvancedInstallers 
d----- 5/10/30 14:20 af-ZA 
d----- 3/19/31 13:53 am-et 
d----- 3/19/31 13:52 AppLocker
...

 

 

 

特定のフォルダにある特定の拡張子を含むファイル名を取得したい場合は -Filter を使います。ここでは、System32 フォルダ内にテキストがあるかファイルを取得してみました。

 

Get-ChildItem "C:\Windows\System32" -Filter *.txt


# 実行結果

ディレクトリ: C:\Windows\System32

Mode LastWriteTime Length Name 
---- ------------- ------ ---- 
-a---- 6/11/01 11:17 6658 VmChipset Third-Party Notices.txt 
-a---- 3/19/31 13:46 1649 WindowsCodecsRaw.txt

 

 

 

特定のフォルダにあるフォルダ名を取得したい場合は -Directoryを使います。ここでは、System32 フォルダ内にフォルダがあるか取得してみました。

 

Get-ChildItem -Directory "C:\Windows\System32"


# 実行結果

ディレクトリ: C:\Windows\System32

Mode LastWriteTime Length Name 
---- ------------- ------ ---- 
d----- 3/19/31 15:20 0409 
d----- 3/19/31 13:53 AdvancedInstallers 
d----- 5/10/30 14:20 af-ZA 
d----- 3/19/31 13:53 am-et 
d----- 3/19/31 13:52 AppLocker 
d----- 5/24/01 9:25 appmgmt 
d----- 6/1/01 8:42 appraiser 
d---s- 3/19/31 15:23 AppV 
d----- 5/24/01 8:47 ar-SA 
d----- 5/10/30 14:20 as-IN 
d----- 11/16/30 23:16 az-Latn-AZ
...

 

 

 

特定のフォルダにあるファイルを再帰的に取得したい場合は、-Recurce を使います。それをパイプで Where-Object コマンドレットに渡してファイルの属性を a (アーカイブ) を指定しています。属性の一覧は以下にまとめておきました。

 

User1 のデスクトップから再帰的に 1 日より前のファイルを取得するといった内容です。

 

属性 説明
d ディレクトリ
a アーカイブ
r 読み取り専用
h 隠しファイル
s システムファイル

 

 

Get-ChildItem -Recurse "C:\Users\user1\desktop" | `
Where-Object {($_.Mode -eq "-a----") -and ($_.CreationTime -lt (Get-Date).AddDays(-1))} 


# 実行結果

ディレクトリ: C:\Users\user1\desktop

Mode LastWriteTime Length Name 
---- ------------- ------ ---- 
-a---- 6/11/01 20:18 1861 Windows10インストール.pptx - ショートカット.lnk
-a---- 6/11/01 20:34 2503 PowerShell記事.doc
-a---- 6/30/01 15:39 0 新しいテキスト ドキュメント.txt


ディレクトリ: C:\Users\user1\desktop\新しいフォルダー

Mode LastWriteTime Length Name 
---- ------------- ------ ---- 
-a---- 6/29/01 14:19 22350 1.jpg 
-a---- 6/29/01 14:19 16145 2.jpg

 

 

 

取得した後にどうするか (応用)

 

 

上の方法でファイルの一覧を取得したり、特定の拡張子を持つファイルを取得した後に様々な処理をする事ができます。

 

 

ここで重要なのが、取得したファイルの情報 (オブジェクト) をこの縦棒 | を使って次の処理に渡してあげるという事です。

 

 

この縦棒がパイプライン (以降パイプと省略) というものになります。パイプについては以下の記事で説明していますので、分からない方は読んで理解される事をお勧めします。

 

 

 

パイプで処理結果を渡した後に、次の処理を行います。ここではいくつか簡単なサンプルを挙げてみましたので参考になれば幸いです。

 

 

 

テキストに書き込む場合

 

 

取得したファイルの情報をパイプで渡し、Out-File コマンドレットでテキストファイルとして出力する事ができます。

 

Get-ChildItem -Recurse "C:\Users\user1\desktop" | `
Where-Object {($_.Mode -eq "-a----") -and ($_.CreationTime -lt (Get-Date).AddDays(-1))} | `
Out-File -FilePath "C:\Users\user1\desktop\list.txt"

 

 

 

別の場所にコピー・または移動する場合

 

 

取得したファイルの情報 $File に代入し、移動元のフォルダ ($Source) と取得したファイル名 ($File) を Join-Path コマンドレットでフルパスに結合します。その後に Move-Item コマンドレットでファイルと移動先のフォルダ ($Target) へ移動します。

 

$Source = "D:\Work"
$Target = "D:\Work\Log"
$File = Get-ChildItem $Source -Filter *.log
$Source = Join-Path $Source $File
Move-Item $Source $Target -Force

 

 

 

まとめ

 

 

以上になります。いかがでしょうか。

 

 

ここではファイルを取得した後にパイプを使って様々な処理ができる事が分かりました。

 

 

実際に現場で使える処理になりますので、まずはファイルの取得をする方法を覚えておきましょう。取得する処理が理解できたら、次へ上に書いたとおりにテキストに出力したり、移動したり削除したりする処理にパイプを使って渡してあげてみて下さい。

 

 

また色々な処理を試してみて効率の良い処理などを試してみると面白いかと思います。

 

 

それでは最後までお読みいただきありがとうございました!

 

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りでマイペースな人です。

人気記事

1

こんにちは!SE ブログの相馬です。       今回は、PC に適用されている GPO を確認する方法について書きました。     グループポリシー ...

2

こんにちは!SE ブログの相馬です。       今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは ...

3

こんにちは!SE ブログの相馬です。       今回は、グループポリシーを使って、特定のコンピューターに対して、ドメインユーザーに Administrators 権限を ...

4

こんにちは!SE ブログの相馬です。       今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 ...

5

こんにちは!SEブログの相馬です。       今回は、ユーザープロファイルを削除する方法について書いてみました。     1 台の PC を複数人で ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!SE ブログの相馬です。       今回は、Windows Server 2016 で NTP サーバーと同期する方法について書きました。   & ...

-PowerShell
-