【PowerShell】その1)ファイル・フォルダー操作のコマンドレットと外部コマンド

変更履歴

Rev. 0.7 : 2025年05月02日
新規作成

1 はじめに

PowerShellって、従来のMSDOSコマンドプロンプトLinuxなどUNIX系のBashと比べると
どうも難しい。
とにかく、“コマンドレット”っていうのが、よくわからない。
PowerShell実践ガイドブック」 なる本を購入してみたが、分厚くてくじけそうになりました。

それじゃー、理解できるところを始めようと、
まずは身近なファイル操作のコマンドレットをまとめてみました。

初めてのPowerShell」は、PowerShellスクリプトが書けるようになるまでを、
シリーズとしてまとめていきたいと思っています。

コマンドレットとは
パイプラインとリダイレクション
PowerShellスクリプト

初回は、身近なファイル・フォルダー操作のコマンドレットと、
exe形式の外部コマンドコマンドプロンプトのBATファイルの起動についてから。

ファイル・フォルダー操作のコマンドレットで、
コマンドレットがどんなものであるかイメージを掴めると思います。

あくまでも、各コマンドレットのイメージを掴むことを目的としていますので、
各コマンドレットの全仕様はコマンドレットのリンクページでご確認くださるよう
お願いいたします。

2 ファイル・フォルダー操作のコマンドレット

本章では、PowerShellでのファイル・フォルダー操作に関するコマンドレットの概要を示します
(参考:  ファイルとフォルダーの操作 | Learn > PowerShell )。

コマンドレットのオプションパラメータなど詳細については、
Microsoftの次のページをご覧いただければと思います。

Microsoft.PowerShell.Management

応用としてのパイプラインやリダイレクションなどの利用ついては、本記事では示さず、 別の記事で示すことにします。

表2-1 ファイル・フォルダー操作のコマンドレット一覧

操作WindowsコマンドプロンプトPowerShell
ファイルの一覧表示dirGet-ChildItem
カレントフォルダーの取得echo %CD%Get-Location
カレントフォルダーの移動cdSet-Location
空ファイルの作成copy nul test.txtNew-Item
ファイルのコピーcopyCopy-Item
ファイルの移動moveMove-Item
ファイルのリネームrenRename-Item
ファイル削除delRemove-Item
フォルダーの作成mkdirNew-Item -ItemType "Directory"
フォルダーのコピーxcopyCopy-Item
フォルダーの移動moveMove-Item
フォルダーのリネームrenRename-Item
フォルダーの削除rmdirRemove-Item
ファイルの内容表示typeGet-Content
ファイルへの書き込みecho xxxx>test.txtSet-Content
ファイルへの追記echo xxxx>>test.txtAdd-Content
ファイルを空にするcopy nul test.txtClear-Content
ファイル中の文字検索findstrSelect-String
ファイルの検索where /R c:\dev\ps\file\ *.txtGet-ChildItem
ファイルの属性変更attribSet-ItemPropath

2.1 ファイル・フォルダーの一覧表示

指定のパス配下のファイルとフォルダーの一覧は、 “Get-ChildItem”で取得することができます。

2.1.1 単純な例

-Path”を省略した場合は、カレントフォルダーの一覧を表示します。

デフォルトでは、Get-ChildItemは、アイテムのモード(Attributes)、LastWriteTime
ファイルサイズ(Length)、およびNameをリストします。

Modeプロパティの文字は、次のように解釈できます

デフォルトの検索オプションでは、隠しファイルは表示されません。
-Force”オプションを付与することで、隠しファイルも表示されるようになります。

2.1.2 ワイルカード表示

# ワイルドカードで指定する
PS C:\> Get-ChildItem -Path ./t*,r*

2.1.3 サブフォルダーの内容も再帰的に表示

-Recurse”、または“-r”オプションを付けると、
サブフォルダーの内容を表示することができます。

# サブフォルダを再帰的に呼び出す PS C:\> Get-ChildItem -Path ./testfolder -Recurse
PS C:\> Get-ChildItem -Path ./testfolder -r

2.2 カレントフォルダーの取得

現在作業しているカレントフォルダーの位置は、 “Get-Location”で取得することができます。

対話で実行している場合、プロンプトに既に表示されているので使う必要はないと思いますが、
スクリプトの中では使うことがあるのかもしれません。

PS C:\dev\ps\file> Get-Location
 
Path
---- C:\dev\ps\file

2.3カ カレントフォルダーの移動

カレントフォルダーは、 “Set-Location”で移動することができます。

Set-Location -Path c:\dev\
Set-Location -Path c:\d?v
Set-Location c:\d?v

他にも、次のコマンドレットでカレントフォルダーを移動することができます。

・ “Push-Location
・ “Pop-Location

2.4 空ファイルの作成

空のファイルの作成は、“New-Item” に“-ItemType “File””を指定して実行します。
-ItemType “File””が指定されなかった場合も、ファイルとして作成されます・

-Path”オプションで、ファイルの作成位置を指定することができます。

PS C:\> New-Item test(1).txt -ItemType "File"
PS C:\> New-Item -Path C:\test\test(2).txt -ItemType "File"
PS C:\> New-Item -Name test(3).txt -ItemType "File"
PS C:\> New-Item ./漢字ファイル.txt

2.5 ファイルのコピー

ファイルのコピーは、 “Copy-Item”を使用します。

PS C:\> Copy-Item -Path test.txt -Destination folder
PS C:\> Copy-Item -Path test.txt,b.txt -Destination folder
PS C:\> Copy-Item -Path ./test1.txt -Destination test2.txt
PS C:\> Copy-Item -Path test*.txt -Destination folder
PS C:\> Copy-Item test*.txt folder

2.6 ファイルの移動

ファイルの移動は、 “Move-Item”を用いて行います。

PS C:\> Move-Item -Path a.txt -Destination b.txt
PS C:\> Move-Item -Path b.txt -Destination ./folder
 
# ワイルドカードを指定する例 PS C:\> Move-Item -Path a*.txt -Destination ./folder2
PS C:\> Move-Item b*.txt ./folder2

2.7 ファイルのリネーム

ファイルのリネームには、 “Rename-Item”を使用します。

PS C:\> Rename-Item -Path test.txt -NewName test2.txt
PS C:\> Rename-Item test2.txt test3.txt

2.8 ファイル削除

ファイルの削除は、 “Remove-Item”で行います。

PS C:\> Remove-Item -Path test.txt
PS C:\> Remove-Item -Path test.txt,test2.txt
PS C:\> Remove-Item -Path *.txt
PS C:\> Remove-Item *.txt

2.9 フォルダーの作成

フォルダーを作成する場合は、 “New-Item”に、“-ItemType "Directory"”を指定して
実行します。

パス中に存在しないフォルダーが混ざっていても、
途中の存在しないフォルダーを作成しながらフォルダーを作成していきます。

PS C:\> New-Item ./example -ItemType "Directory"
PS C:\> New-Item -Path ./subfolder/example2 -ItemType "Directory"
PS C:\> New-Item -Name example3 -ItemType "Directory"
PS C:\> New-Item ./subdir1,./subdir2 -ItemType "Directory"
PS C:\> New-Item ./subdir/grandchild -ItemType "Directory"
PS C:\> New-Item ./nonexist/child1/child2/child3/targetdir -ItemType "Directory"
 
# ワイルドカードの指定
PS C:\> New-Item -Path ./??? -Name subdir -ItemType "Directory"

2.10 フォルダーのコピー

ファイルのコピーと同様に、 “Copy-Item”を使用してフォルダーのコピーを行います。
コピー先に指定したフォルダーの配下にコピー先のフォルダーが作成されます。

PS C:\> Copy-Item -Path ./srcdir -Destination destdir -Recurse

2.11 フォルダーの移動

フォルダーの移動は、 “Move-Item”を用いて行います。

PS C:\> Move-Item -Path ./srcdir -Destination destdir -Recurse

2.12 フォルダーのリネーム

フォルダーのリネームには、 “Rename-Item”を使用します。

PS C:\> Rename-Item -Path oldfolder -NewName newfolder
PS C:\> Rename-Item oldfolder newfolder

2.13 フォルダーの削除

フォルダーの削除は、 Remove-Item”で行います。

PS C:\> Remove-Item folder
PS C:\> Remove-Item folder -Recurse

2.14 ファイルの内容表示

ファイルの内容表示を行うには、 “Get-Content”を使用します。

PS C:\> Get-Content -Path ../x.txt
PS C:\> Get-Content -Path x.txt,y.txt
PS C:\> Get-Content -Path *.txt
PS C:\> Get-Content *.txt

2.15 ファイルへの書き込み

Set-Content”を用いることで、ファイルへの書き込みが行えます。

PS C:\> Set-Content -Path .\a.txt -Value 'Hello, World'
PS C:\> Set-Content -Path a1.txt,a2.txt -Value 'Hello, World'
PS C:\> Set-Content -Path .\b*.txt -Value 'Hello, World'
PS C:\> Set-Content .\c*.txt -Value 'Hello, World'

2.16 ファイルへの追記

Add-Content”を用いることで、ファイルに更新が行えます。

PS C:\> Add-Content -Path .\a.txt -Value 'end of file'
PS C:\> Add-Content -Path a1.txt,a2.txt -Value 'end of file'
PS C:\> Add-Content -Path .\b*.txt -Value 'end of file'
PS C:\> Add-Content .\c*.txt -Value 'end of file'

2.17 ファイルを空にする

ファイルを削除しないが、内容を空にするには “Clear-Content”を使用します。

PS C:\> Clear-Content -Path a.txt
PS C:\> Clear-Content -Path a1.txt,a2.txt
PS C:\> Clear-Content -Path b*.txt
PS C:\> Clear-Content c*.txt -Force

2.18 ファイル中の文字検索

ファイル中の文字列検索には、 “Select-String”を使用します。

検索パターンや検索条件の指定にはいろいろあり、
またパイプを使っていろいろナコマンドレットと組み合わせて使うことが多いので、
本記事ではシンプルな検索例のみを示すだけにとどめます。

# カレントフォルダーのtxtファイル中にGetが含まれるものを列挙する
PS C:\> Select-String -Path .\*.txt -Pattern 'Get'
 
# cp932/unicode/utf(BOMあり)のファイルが検索可能
PS C:\> Select-String -Path .\*.txt -Pattern 'あ' -Encoding Default
 
# カレントフォルダーのtxtファイルでファイル名に1を含まないものを対象にGetが含まれるものを列挙する
PS C:\> Select-String -Path .\*.txt -Pattern 'Get' -Exclude *1*
 
# -NotMatchオプションでPatternに一致しない行を列挙する
PS C:\> Select-String -Path *.txt -Pattern "a" -NotMatch

2.19 ファイルの検索

ファイルの検索は、 “Get-ChildItem” の“-Filter”または“-Input”オプションを用います。

オプションだけで対応できない場合は、 “Where-Object”をパイプでつないで、プロパティを指定して条件を抽出します。

PS C:\> Get-ChildItem -Path c:\dev\ps\file\depfolder -Filter *.txt -Recurse -Force
PS C:\> Get-ChildItem -Path c:\dev\ps\file\deepfolder -Include *.txt -Recurse -Force
 
# 100バイトより大きいtxtファイルを取得
PS C:\> Get-ChildItem . -Filter *.txt -r | Where-Object { $_.Length -gt 100 }

2.20 ファイルの属性変更

Set-ItemProperty”を使用すれば、
ファイルの属性と更新日、作成日、最終更新日を変更することができます。

# 読み取り専用にする PS C:\> Set-ItemProperty -Path ./y.txt -Name IsReadOnly -Value $True
 
# 読み取り専用を解除
PS C:\> Set-ItemProperty -Path ./y.txt -Name IsReadOnly -Value $False
 
# 読み取り専用+システムファイル+隠しファイルとする
PS C:\> Set-ItemProperty -Path ./y.txt -Name Attributes -Value 'Hidden,System,ReadOnly'
 
# アーカイブ属性を付与
PS C:\> Set-ItemProperty -Path ./y.txt -Name Attributes -Value 'Archive'
 
# 複数ファイルを対象に操作
PS C:\> Set-ItemProperty -Path x.txt,y.txt -Name IsReadOnly -Value $True
PS C:\> Set-ItemProperty -Path *.txt -Name IsReadOnly -Value $True -WhatIf
PS C:\> Set-ItemProperty -Path *.txt -Name IsReadOnly -Value $True -Confirm

3 外部コマンドの実行

3.1 ネイティブコマンド

オペレーティング システムにインストールされている実行可能ファイルを
ネイティブコマンドと言います。

Windows標準の外部コマンドをはじめとするexe実行ファイルであれば、
コマンドプロンプトと同様に、
PowerShellプロンプトで実行ファイル名をコマンドとして入力するだけで実行できます。

① 直接コマンド名を入力する
② “Start-Process”コマンドレットにより起動する

【直接コマンド名を入力する】
Windows標準の外部コマンドをはじめとするexe実行ファイルであれば、
コマンドプロンプトと同様に、
PowerShellプロンプトで実行ファイル名をコマンドとして入力するだけです。

パスが通っていない場合、絶対パスもしくは相対パスでプログラムを実行することができます。

【“Start-Press”コマンドレットにより起動する】

3.2 コマンドプロンプトBATファイルの実行

コマンドプロンプトのBATファイルは、
Start-Process”コマンドレットにより起動することができます。

以上

本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
少しでも役に立てていただければ、うれしく思います。

このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元著者名は明らかにしてください

なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ