PowerShell ファイル関連
PowerShellのファイルの入出力をまとめます。 ■サンプル:ファイルを読み込み、ループでまわす
#読み込むファイルパス
$readPath = "C:\work\powershell\read.txt"
#ファイルの読み込み
$readAry = (Get-Content $readPath) -as [string[]]
#ファイル中身でループ
foreach($readStr in $readAry){
#ファイルの内容出力
echo $readStr;
}
■サンプル:配列をファイルに書き込む(UTF-8 BOMあり)
#出力するファイルパス
$writePath = "C:\work\powershell\write.txt"
#出力する配列定義
$writeAry = "aaa","bbb","","ccc"
#出力処理(上書き)
$writeAry | Out-File $writePath -encoding UTF8
#出力処理(追記)
"ddd" | Out-File $writePath -encoding UTF8 -Append
■サンプル:UTF-8 BOMなしでファイル出力
$data = "UTF-8 BOMなしで出力"
$path = "C:\tmp\test.txt"
$UTF8 = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllLines($path, $data, $UTF8)
■サンプル:SJISでファイル出力
#出力するファイルパス
$writePath = "C:\work\powershell\write.txt"
#出力する配列定義
$writeAry = "aaa","bbb","","あああ"
$encoding = [Text.Encoding]::GetEncoding(932)
[System.IO.File]::WriteAllLines($writePath, $writeAry, $encoding)
■サンプル:UTF-8 ファイル読み込み
$path = "C:\tmp\test.txt"
Get-Content -Encoding UTF8 $path
■サンプル:エンコードを指定してファイル読み込み
$encoding = [Text.Encoding]::GetEncoding(932)
#読み込むファイルパス
$readPath = "C:\work\powershell\read.txt"
#ファイルの読み込み
$readAry = [System.IO.File]::readAllLines($readPath, $encoding)
■サンプル:ファイルを読み込んで、(編集して)出力する
#読み込むファイルパス
$readPath = "C:\work\powershell\read.txt"
#出力するファイルパス
$writePath = "C:\work\powershell\write.txt"
#ファイルの読み込み
$readAry = (Get-Content $readPath) -as [string[]]
#出力する配列定義
$writeAry = @()
#ファイル中身でループ
foreach($readStr in $readAry){
#ファイルの内容出力(ここで編集する)
$writeAry += $readStr;
}
#出力処理
$writeAry | Out-File $writePath -encoding UTF8
■サンプル:フォルダ作成(削除)、ファイル作成(削除)
#フォルダ作成
New-Item c:\new1\new2 -itemType Directory
#フォルダ削除
Remove-Item c:\new1\new2 -Recurse
#ファイル作成
New-Item c:\new1\new2\new3.dat -itemType File -Value "ファイルの内容"
#ファイル削除
Remove-Item c:\new1\new2\*.txt
ファイルが存在する場合、削除
$path = "C:\tmp\appp.log"
#ファイル存在チェック
if(Test-Path $path){
#ファイル削除
Remove-Item $path
}
フォルダ作成は親フォルダも作ってくれます。
■サンプル:ファイルコピー、ファイル移動
#ファイルコピー
Copy-Item C:\tmp\from.txt C:\tmp\to1.txt
#ファイル移動
Move-Item C:\tmp\from.txt C:\tmp\to2.txt
-Forceを付けると強制上書きになります。
■サンプル:フォルダコピー
Copy-Item -Path C:\workFrom -Recurse -Destination C:\workTo
#指定ファイルのみコピー
Copy-Item -Filter *.txt -Path C:\workFrom -Recurse -Destination C:\workTo
■サンプル:空のファイルを作成
New-Item -Type File new.txt
■サンプル:親フォルダ取得、ファイル名取得
#親フォルダ取得( C:\work\powershell が取得される)
Split-Path "C:\work\powershell\write.txt" -Parent
#ファイル取得( write.txt が取得される)
Split-Path "C:\work\powershell\write.txt" -Leaf
■サンプル:ps1ファイルのパスを取得、パスの結合
#ps1ファイルのパスを取得し、その親フォルダを取得
$path = Split-Path $MyInvocation.MyCommand.Path -Parent
#パスの結合
$fullPath = Join-Path $path "read.txt"
echo $fullPath
$MyInvocation.MyCommand.Path ・・・ ps1ファイルパスの取得
Split-Path XXX -Parent ・・・ 親フォルダを取得
■サンプル:カレントディレクトリ取得、パスの結合
#カレントディレクトリ取得
$path = Get-Location
#パスの結合
$fullPath = Join-Path $path "read.txt"
echo $fullPath
■サンプル:ファイル(フォルダ存在チェック)
$path = "C:\tmp\appp.log";
#ファイル存在チェック
if(Test-Path $path){
echo "ファイルが存在";
}
同じ書き方でファイル、フォルダの存在チェックができます。
■サンプル:ファイルに指定文字が含まれているかチェック
if ((Get-Content "C:\work\memo.txt" | %{$_ -match "test"}) -contains $true) {
Write-Output "TRUE"
}
■サンプル:ファイル一覧
#フォルダ指定
$path = "C:\work\powershell"
#ファイル一覧を取得(更新日の新しい順)
$fileList = Get-ChildItem -Path $path -Recurse -Filter *.txt -Exclude t* | Sort-Object LastWriteTime -Descending
#ファイル毎にループする
foreach($fileWk in $fileList)
{
#フルパス
echo $fileWk.FullName
#ファイル名
echo $fileWk.Name
#更新日
echo $fileWk.LastWriteTime.ToString('yyyy/MM/dd HH:mm:ss')
}
■サンプル:空フォルダを削除
#フォルダ指定
$path = "C:\work\powershell"
for ( $i = 0; $i -lt 10; $i++ )
{
#フォルダ一覧を取得
$dirs = Get-ChildItem -Path $path -Recurse -Directory
$isBreak = $true
#フォルダ毎にループする
foreach($dir in $dirs)
{
if((Get-ChildItem -Path $dir.FullName).Count -eq 0){
Remove-Item -Path $dir.FullName
$isBreak = $false
}
}
if($isBreak){
break
}
}
■サンプル:ファイルの属性取得
$path = "C:\work\powershell\read.txt"
#ファイルの属性を取得
$info = Get-ItemProperty $path
#フルパス
echo $info.FullName
#ファイル名
echo $info.Name
#拡張子
echo $info.Extension
#サイズ
echo $info.Length
#更新日
echo $info.LastWriteTime.ToString('yyyy/MM/dd HH:mm:ss')
■サンプル:ファイル検索
#7日前より後に更新された10MB以下のテキストファイル一覧
Get-ChildItem -Path "C:\tmp" -Recurse -Filter *.txt | Where-Object {$_.LastWriteTime -ge (Get-Date).AddDays(-7) -and ($_.Length -le 10mb)}
オプション | 説明 |
---|---|
-Path | パスを指定 |
-Filter | フィルター。 |
-Include | フィルター。複数指定可能。 パスに*か-Recurseを指定した場合のみ使える 例:-Path "C:\tmp\*" -Include *.csv,*.txt |
-Exclude | 除外。複数指定可能。 ファイルは指定できるが、フォルダは指定できない。 フォルダを除外する場合は、以下のようにWhere-Objectを指定する。 例:Get-ChildItem -Path "C:\tmp" -Recurse | Where-Object FullName -NotLike "*aaa*" |
-Recurse | サブフォルダがあれば再帰的に処理 |
-File | ファイル |
-Directory | ディレクトリ |
Where-Object で細かく条件を指定することができる。
■サンプル:Grep
# フォルダ内のファイルやファイルを指定してGrep
# Select-String "検索単語" ファイル
Select-String "div" C:\work\*.html
# 指定フォルダ内の全ファイルに対してGrep
# Get-ChildItem フォルダ -Filter ファイル -Recurse | Select-String "検索単語"
Get-ChildItem C:\work -Filter *.html -Recurse | Select-String "div"
# Select-String で複数指定(or)する場合、カンマで区切ります
Get-ChildItem C:\work -Filter *.html -Recurse | Select-String "div","br"
# Select-String で複数指定(and)する場合、パイプラインで結合します
Get-ChildItem C:\work -Filter *.txt -Recurse | Select-String "123" | Select-String -NotMatch "abc"
# Grepして結果のファイル名のみを出力
Get-ChildItem C:\work -Filter *.html -Recurse | Select-String "div" | Select-Object path | Split-Path -Leaf | Select-Object -Unique
■サンプル:zip圧縮、解凍
# ファイル指定で圧縮
Compress-Archive -Path C:\work\tmp\a.txt -DestinationPath C:\work\b.zip
# ワイルドカード指定で圧縮
Compress-Archive -Path C:\work\tmp\*.txt -DestinationPath C:\work\b.zip
# フォルダ指定で圧縮
Compress-Archive -Path C:\work\tmp -DestinationPath C:\work\b.zip
# 解凍
Expand-Archive -Path C:\work\b.zip -DestinationPath C:\work\c
-Path で元ファイル(フォルダ)指定、-DestinationPathで先ファイル(フォルダ)指定。強制的に上書く場合、-Force
を付けます。
■サンプル:外部ファイル実行
#外部ファイルを実行
Start-Process "C:\tmp\appp.log"
#コマンドラインオプション指定
Start-Process -FilePath "C:\Program Files (x86)\sakura\sakura.exe" -ArgumentList "-Y=10","C:\tmp\appp.log"
#終了を待つ
Start-Process "C:\tmp\appp.log" -Wait
#ウィンドウを最大化
Start-Process "C:\tmp\appp.log" -WindowStyle Maximized
-WindowStyleは以下の指定ができます。
オプション | 説明 |
---|---|
Maximized | 最大化 |
Minimized | 最小化 |
Hidden | バックグランドで実行 |
■サンプル:実行スクリプトファイルのパスの取得
#実行スクリプトファイルのパス
$PSCommandPath
#実行スクリプトファイルがおいてあるフォルダ
$PSScriptRoot
ページのトップへ戻る