【2023年】これからブログを始める人へおすすめの書籍

Kissy

PowerShellでのファイルの操作方法まとめ

作成: 更新:
Get-Child, Where-Object, Select-Object

この記事ではPowerShellを使ったファイル/フォルダの操作方法を記載しています。

ファイル/フォルダの検索

特定のフォルダ配下にあるファイルやフォルダを列挙する方法です。

フォルダ直下のファイル/フォルダを列挙する

まずは、一番簡単な「特定のフォルダ直下にあるファイルやフォルダを探索列挙してみます。 以下のコードでは、“c:”フォルダ直下にあるすべてのファイルとフォルダを探索列挙しています。

Get-ChildItem "c:\temp"

サブフォルダを含め、フォルダ以下のファイル/フォルダを列挙する

サブフォルダも含めて探索再帰的に列挙する場合は、-Recurseをつけます。

Get-ChildItem "c:\temp" -Recurse

指定条件のファイル/フォルダを検索

指定した条件のファイルを探すには、Get-ChildItem等で検索したファイルの結果を、Where-Objectを使って指定した条件で絞り込みます。

標準のファイルのみに絞り込む

以下のコードでは、“c:”直下にある標準のファイルを探索しています。ここでいう、「標準のファイル」というのは、隠しファイルやシステムファイルなどではないファイルです。

Get-ChildItem "c:\temp" | Where-Object {$_.Attributes -eq "Normal"}

フォルダのみに絞り込む

以下のコードでは、“c:”直下にあるフォルダを探索しています。

Get-ChildItem "c:\temp" | Where-Object {$_.Attributes -eq "Directory"}

ファイルやフォルダの名称で絞り込む

ファイルやフォルダの名称が特定のパターンのものに絞り込むこともできます。 以下のコードでは、“c:”直下にあるファイルやフォルダの名称が、 “access*.log”のパターンのものを探索しています。

Get-ChildItem "c:\temp" | Where-Object {$_.Name -like "access*.log"}

ファイルやフォルダの作成時間で絞り込む

Where-OjectとGet-Dateを組み合わせれば、ファイルやフォルダの作成時間で絞り込むこともできます。 以下のコードでは、作成日時が1ヶ月以上前のものを探索しています。

Get-ChildItem "c:\temp" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddMonths(-1)}

ファイル/フォルダの存在確認

目的のファイルやフォルダのパスがわかっても、存在しない可能性もあります。ほかの人やプログラムがすでに別な場所に移動していたり、削除してしまっている可能性もあるからです。

さながら、宝箱を見つけたのに空っぽだった、というようなことですね。PowerShellではファイルやフォルダが存在するかのチェックも1行できます。

以下のコードでは、“c:”が存在するかを確認しています。

Test-Path "c:\temp"

ファイル内のテキストを検索

ファイルに特定の文字列が含まれるか確認したい!という時はよくあると思います。例えばこんな時です。

  • ログファイルで「NG」の項目があるか/ないかを確認したい
  • ソースコードに特定の関数が使われているファイルとそのラインを知りたい

そんな時は、Select-Stringを使います。

指定した文字列が含まれる行数を確認する

ファイルに指定した文字列が何行目に存在するかを確認するには、以下のようにします。

$info = Select-String -Path “c:¥log¥20180710.log” -Pattern “NG”

この場合の戻り値はMatchainfoクラスのインスタンスです。行数を数値で取得することも出来ます。

指定した文字列の有無を確認する

ファイルに指定した文字列があるか/ないかを確認するには、以下のようにします。

$exist = Select-String -Path “c:¥log¥20180710.log” -Pattern “NG” -Quiet

-Quietをつけると、Patternで指定した文字列があるか/ないかをbooleanで返してくれます。

大文字/小文字を区別して文字列を検索する

デフォルトでは、大文字/小文字を区別しません。区別したい場合は、-CaceSensitiveを指定します。

$exist = Select-String -Path “c:¥log¥20180710.log” -Pattern “NG” -CaceSensitive

正規表現を使わないで文字列を検索する

デフォルトでは、Patternで指定した文字列は正規表現となります。正規表現を使いたくない場合は、SimpleMatchを指定します。

$exist = Select-String -Path “c:¥log¥20180710.log” -SimpleMatch “NG”

マッチしない行を検索する

デフォルトでは、Patternで指定した文字列にマッチする行を返します。マッチしない行を知りたい場合は、NotMatchを指定します。

$exist = Select-String -Path “c:¥log¥20180710.log” -Pattern “NG” -NoMatch

文字エンコード指定して検索する

デフォルトでは、検索対象ファイルの文字エンコードはUTF-8として扱われます。文字エンコードを指定したい場合は、-Encoding <エンコード>を指定します。

日本語のWindowsではShift-JISが使われることが多いです。Shift-JISを指定する場合は、-Encoding defaultとします。

$exist = Select-String -Path “c:¥log¥20180710.log” -Pattern “NG” -Encoding default

ファイル/フォルダのコピー

ファイルをコピーする

指定したファイルをコピーする方法です。

# 指定したファイルを指定したフォルダにコピーする
Copy-Item -Path "D:\Work\Source\hoge.txt" -Destination "D:\Work\Backup"

# 指定したファイルを指定したファイル名でコピーする
Copy-Item -Path "D:\Work\Source\hoge.txt" -Destination "D:\Work\Backup\hoge_backup.txt"

フォルダをまとめて丸ごとコピーする

フォルダ構成をそのままに、フォルダを丸ごとコピーーする場合は、-Recurseをつけます。-Recurseをつけるとフォルダを再帰的にコピーします。

Copy-Item -Path "D:\Work\Source" -Destination "D:\Work\Backup" -Recurse

フォルダ構成をそのままに、特定のファイルだけコピーする

フォルダ構成をそのままに、特定のファイルのみをコピーする場合は、-Filterをつけます。-Filterはワイルドカードを使ってコピーしたいファイルを指定します。これにより、フォルダ内に色々な種類のファイルが混在している中から特定のファイルのみコピーすることができます。ここではPNGファイルのみコピーしています。

Copy-Item -Path "D:\Work\Source" -Destination "D:\Work\Backup" -Recurse -Filter "*.png"

ファイルはコピーせず、フォルダ構成だけコピーする

ファイルはコピーせず、フォルダ構成だけをコピーする場合は、-Filterでフォルダのみフィルタリングしてコピーします。

Copy-Item -LiteralPath "D:\Work\Source" -Destination "D:\Work\Backup" -Recurse -Filter {PSIsContainer -eq $true}

フォルダ構成を維持せず、フラットにしてファイルをコピーする

フォルダ構成は維持しないで、ファイルだけをコピー先にコピーする場合は、常にコピー先を同じフォルダになるようにコピーします。

Get-ChildItem -Path "D:\Work\Source" -Recurse | Copy-Item -Destination "D:\Work\Backup" -Force

上記例だと、フォルダもコピーされます。フォルダが不要な場合は、以下のようにフォルダ以外にフィルタしてコピーすることでファイルのみをコピーできます。

Get-ChildItem -Path "D:\Work\Source" -Recurse | Where-Object {$_.Attributes -ne "Directory"} | Copy-Item -Destination "D:\Work\Backup" -Force

ファイル/フォルダの削除

ファイルを削除する

指定したファイルを削除する方法です。

# 指定したファイルを削除する
Remove-Item -Path "D:\Work\Source\hoge.txt"

# 複数のファイルを削除する
Remove-Item -Path "D:\Work\Source\hoge1.txt","D:\Work\Source\hoge2.txt"

# 複数のファイルを削除する(ワイルドカードで指定)
Remove-Item -Path "D:\Work\Source\hoge*.txt"

# 読み取り専用ファイルを削除する
Remove-Item -Path "D:\Work\Source\hoge.txt" -Force

# 削除されるファイルを確認する(削除は実行されない)
Remove-Item -Path "D:\Work\Source\hoge*.txt"-WhatIf

フォルダを削除する

指定したフォルダを削除する方法です。

# 指定したフォルダを削除する
Remove-Item -Path "D:\Work\Source"

# 空でないフォルダを削除する
Remove-Item -Path "D:\Work\Source" -Recurse

# 読取専用や隠しファイルを含むフォルダを削除する
Remove-Item -Path "D:\Work\Source" -Recurse -Force

空のフォルダを再帰的に削除する

空のフォルダを再帰的に削除する方法です。

Get-ChildItem -Path "D:\Work\ParentFolder" -Recurse -Directory | Where-Object {(Get-ChildItem $_.fullname).Count -eq 0} | Remove-Item

ファイル/フォルダの移動

ファイルを移動する

指定したファイルを移動する方法です。

# 指定したファイルを指定したフォルダに移動する
Move-Item -Path "D:\Work\Source\hoge.txt" -Destination "D:\Work\Backup"

# 指定したファイルを指定したファイル名で移動する
Move-Item -Path "D:\Work\Source\hoge.txt" -Destination "D:\Work\Backup\hoge_backup.txt"

フォルダを移動する

フォルダ移動する場合も、ファイルと同様です。

Move-Item -Path "D:\Work\Source" -Destination "D:\Work\Backup"

ファイル/フォルダのリネーム

ファイルをリネームする

指定したファイルをリネームする方法です。

# ファイルをリネームする
Rename-Item -Path "D:\Work\Source\hoge1.txt" -NewName "D:\Work\Source\hoge2.txt"

フォルダをリネームする

指定したフォルダをリネームする方法です。

# フォルダをリネームする
Rename-Item -Path "D:\Work\Source1" -NewName "D:\Work\Source2"

ファイルの属性

属性を取得する

# ファイルプロパティの取得(フォルダ)
(Get-ItemProperty "File.ps1").DirectoryName

# ファイルプロパティの取得(ファイル名)
(Get-ItemProperty "File.ps1").Name

# ファイルプロパティの取得(拡張子)
(Get-ItemProperty "File.ps1").Extension

# ファイルプロパティの取得(ファイルサイズ)
(Get-ItemProperty "File.ps1").Length

# ファイルプロパティの取得(読み取り専用)
(Get-ItemProperty "File.ps1").IsReadOnly

# ファイルプロパティの取得(作成日時)
(Get-ItemProperty "File.ps1").CreationTime

# ファイルプロパティの取得(作成日時(UTC))
(Get-ItemProperty "File.ps1").CreationTimeUtc

# ファイルプロパティの取得(更新日時)
(Get-ItemProperty "File.ps1").LastWriteTime

# ファイルプロパティの取得(更新日時(UTC))
(Get-ItemProperty "File.ps1").LastWriteTimeUtc

# ファイルプロパティの取得(アクセス日時)
(Get-ItemProperty "File.ps1").LastAccessTime

# ファイルプロパティの取得(アクセス日時(UTC))
(Get-ItemProperty "File.ps1").LastAccessTimeUtc

# ファイルプロパティの取得(属性)
(Get-ItemProperty "File.ps1").Attributes

# ファイルプロパティの取得(モード)
(Get-ItemProperty "File.ps1").Mode

# ファイルプロパティの取得(ファイルバージョン)
(Get-ItemProperty "File.ps1").VersionInfo.FileVersion

# ファイルプロパティの取得(ファイルバージョンのメジャーバージョン)
(Get-ItemProperty "File.ps1").VersionInfo.FileVersion.Major

# ファイルプロパティの取得(製品バージョン)
(Get-ItemProperty "File.ps1").VersionInfo.ProductVersion

# ファイルプロパティの取得(会社名)
(Get-ItemProperty "File.ps1").VersionInfo.CompanyName

# ファイルプロパティの取得(製品名)
(Get-ItemProperty "File.ps1").VersionInfo.ProductName

# ファイルプロパティの取得(説明)
(Get-ItemProperty "File.ps1").VersionInfo.FileDiscription

# ファイルプロパティの取得(言語)
(Get-ItemProperty "File.ps1").VersionInfo.Language

属性を変更する

# ファイルプロパティの設定(フォルダ) ... 読取専用のため変更不可
# (Get-ItemProperty -Path "File.ps1").DirectoryName

# ファイルプロパティの設定(ファイル名) ... 読取専用のため変更不可
# (Get-ItemProperty -Path "File.ps1").DirectoryName

# ファイルプロパティの設定(拡張子) ... 読み取り専用のため変更不可
# (Get-ItemProperty -Path "File.ps1").Extension

# ファイルプロパティの設定(ファイルサイズ) ... 読み取り専用のため変更不可
# (Get-ItemProperty -Path "File.ps1").Length

# ファイルプロパティの設定(読み取り専用)
Set-ItemProperty -Path "File.ps1" -name IsReadOnly -value $true
Set-ItemProperty -Path "File.ps1" -name IsReadOnly -value $false

# ファイルプロパティの設定(作成日時)
Set-ItemProperty -Path "File.ps1" -name CreationTime (Get-Date -Format "yyyy/MM/dd HH:mm::ss") -Force

# ファイルプロパティの設定(作成日時(UTC))
Set-ItemProperty -Path "File.ps1" -name CreationTimeUtc (Get-Date -Format "yyyy/MM/dd HH:mm::ss") -Force

# ファイルプロパティの設定(更新日時)
Set-ItemProperty -Path "File.ps1" -name LastWriteTime (Get-Date -Format "yyyy/MM/dd HH:mm::ss") -Force

# ファイルプロパティの設定(更新日時(UTC))
Set-ItemProperty -Path "File.ps1" -name LastWriteTimeUtc (Get-Date -Format "yyyy/MM/dd HH:mm::ss") -Force

# ファイルプロパティの設定(アクセス日時)
Set-ItemProperty -Path "File.ps1" -name LastAccessTime (Get-Date -Format "yyyy/MM/dd HH:mm::ss") -Force

# ファイルプロパティの設定(アクセス日時(UTC))
Set-ItemProperty -Path "File.ps1" -name LastAccessTimeUtc (Get-Date -Format "yyyy/MM/dd HH:mm::ss") -Force

# ファイルプロパティの設定(属性を隠しファイル+システムファイルに設定)
Set-ItemProperty -Path "File.ps1" -Name Attributes -Value 'Hidden,System'

# ファイルプロパティの設定(属性をすべて外す)
Set-ItemProperty -Path "File.ps1" -Name Attributes -Value 'Normal'

# ファイルプロパティの設定(モード) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").Mode

# ファイルプロパティの設定(ファイルバージョン) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.FileVersion

# ファイルプロパティの設定(ファイルバージョンのメジャーバージョン) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.FileVersion.Major

# ファイルプロパティの設定(製品バージョン) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.ProductVersion

# ファイルプロパティの設定(会社名) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.CompanyName

# ファイルプロパティの設定(製品名) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.ProductName

# ファイルプロパティの設定(説明) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.FileDiscription

# ファイルプロパティの設定(言語) ... 変更不可
# (Get-ItemProperty -Path "File.ps1").VersionInfo.Language

テンポラリファイル/フォルダ

テンポラリファイルを作成する

# テンポラリファイル作成
$tempFile  =  New-TemporaryFile

テンポラリファイルを削除する

# テンポラリファイル削除
Remove-Item  -Path  $tempFile

テンポラリフォルダを作成する

# テンポラリフォルダ作成
$tempDir  =  New-TemporaryFile | ForEach-Object {Remove-Item  $_; New-Item  $_  -ItemType Directory;}

テンポラリフォルダを削除する

# テンポラリフォルダの削除
$tempDir | Where-Object { Test-Path $_ } | ForEach-Object { Get-ChildItem $_ -File -Recurse | Remove-Item; $_} | Remove-Item -Recurse

最後まで読んでいただきありがとうございます。 また読んでくださいませ。 そんじゃーね。

関連記事

SPONSORED LINK
SPONSORED LINK