適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【PowerShell】テンポラリファイル・一時ファイルを使う【New-TemporaryFile】

PowerShellでスクリプトを作っていると一時的なテンポラリファイルが必要になることがあります。

一時ファイルなので、重複しないファイル名で、さらにあまり使われることのないファイル名でファイルを作成する必要があり、自分で名前を付けるのは大変です。

PowerShellでは、そんな時に便利な機能が用意されています。

検証した環境

Windows10
PowerShell 5.1

New-TemporaryFileコマンドレット

PowerShellで一時ファイルを作成するにはNew-TemporaryFileコマンドレットを使います。

 
New-TemporaryFile

実行すると、一時フォルダに一時ファイルが作成されます。

一時ファイルの作成されるディレクトリは、

 
$env:TEMP

で調べることができます。

[System.IO.Path]::GetTempFileName()

New-TemporaryFileコマンドレットではなく、

 
[System.IO.Path]::GetTempFileName()

上記のように呼び出してもNew-TemporaryFileコマンドレットと同じことができます。

やはり、$env:TEMPに一時ファイルが作成されます。

実はNew-TemporaryコマンドレットはSystem.IO.Path::GetTempFileName() を呼び出しているだけなので、どちらを使っても結果は同じです。

また、Getと言っていますが、物理的に一時ファイルを作成しています。

New-TemporaryFileコマンドレットと[System.IO.Path]::GetTempFileName()の注意点

どちらも作成された一時ファイルのサイズは0バイトで、拡張子は.tmpになります。

また、不要になったファイルの削除は自分で行う必要がありますのでご注意ください。

一時ファイルが作成される場所について

一時ファイルが作成される場所を参照する方法は2つあり、自動変数の$env:TEMPか、System.IO.Path::GetTempPath()メソッドを呼び出すことで確認できます。

$env:TEMP

一時ファイルの作成場所は、

自動変数の$env:TEMPに格納されています。

次のように確認することができます。

 
$env:TEMP
#C:\Users\ユーザー名\AppData\Local\Temp

[System.IO.Path]::GetTempPath()

一時ファイルの作成場所を調べることができます。

 
[System.IO.Path]::GetTempPath()
#C:\Users\ユーザー名\AppData\Local\Temp\

$env:TEMPと比較すると、末尾に区切り記号があるかないかの違いになります。

これはささいな問題に見えるかもしれませんが、パスを生成するときに「単純に」文字列を結合してパスを生成しようとすると問題が生じます。

こういうときは、Join-Pathコマンドレットを使えば末尾にある区切り記号について上手に処理してくれます。

次の2つのコマンドはどちらも

C:\Users\ユーザー名\AppData\Local\Temp\a.tmp

を返してくれます。

 
Join-Path ([System.IO.Path]::GetTempPath()) "a.tmp"
Join-Path ($env:TMP) "a.tmp"

終わりに

PowerShellの一時ファイルの使い方についてまとめてみました。

対話的にPowerShellを使っているときはあまり出番はないかもしれませんが、ちょっと長いスクリプトを書くときなどは、一時ファイルを使うと便利な場面があります。

一時ファイルを使った後はちゃんと追片付けまでして、お行儀のいいスクリプトを書くようにしましょう(自分への戒めを込めて)。

というわけで、ここまでお読みいただきありがとうございました。