この小さな記事では、ファイルが存在するかどうかを確認するためのコマンドレット「Test-Path」の使い方を説明しています – また、かつて同僚がSCOMのコンテキストで使わなければならなかった.NETの代替手段についても説明しています。 詳細については、Get-Help Test-Pathと入力し、おそらく”-online “スイッチを使ってください。
また、System.IO.Fileクラスからの.NETクラスメソッドExists()を簡単に実演しています。
また、現在ファイルが存在しない場合に新しいファイルを作成する方法を実演し、ファイル作成の失敗を優雅に処理する方法を紹介しています。
Tweet
How To Check A File Exists With PowerShell
コマンドラインでの確認には、このようなものを使うことができます。
PS C:\> Test-Path C:\WindowsTrue
パスにスペースや括弧、その他思いつかない文字が含まれている場合は、引用符が必要であることに注意してください。 PowerShellでは、タブで補完すると自動的に引用符が追加されます。 二重引用符は変数を「展開」してしまうので、一重引用符を使うことをお勧めします(パスに「$」が含まれている場合に関係します)。
PS C:\> Test-Path -Path 'C:\Program Files'True
そうしないと、次のように表示されます。
PS C:\> Test-Path C:\Program FilesTest-Path : A positional parameter cannot be found that accepts argument 'Files'.
ディレクトリではなくファイルであることを明示的に確認するには、次のような値を持つ -PathType パラメータを使用します。
- Any
- Leaf (file)
- Container (directory/folder)
スクリーンショットの例
スクリプトの使い方
スクリプトでは、通常 if 文の中で使用します。
また、パスやファイル名にスペースが含まれている場合は、パス全体を引用符で囲む必要があることも覚えておいてください。 パスやファイル名に「拡張可能」な部分がない場合は、シングルクォートでもダブルクォートでも同じように動作しますが、少しでも安全な選択はシングルクォートです。
また、-Pathと-LiteralPathの違いについても知っておく必要があります。 後者は名前が示すようにパスを文字通りに受け取りますが、前者はワイルドカード構文をサポートします。 これは、ファイルの中に不揃いのカギカッコが入っている場合に偶然発見されることが多いのですが、これは「-like」が使用する同じ構文の一部であり、16進数の1桁分のようなものだからです。 これは、少なくともPowerShellの以前のバージョンでは、-Pathを使用する際にエラーメッセージを引き起こします。 1つのルートディレクトリからディレクトリ構造をリストアップする場合は、-LiteralPathを使用してください。
Creating A File If It Doesn’t Exist
コマンドレット Set-Content を使用すると、現在ファイルが存在しない場合に新しいファイルを作成することができます。
私の例や Get-Help Set-Content、またはオンラインの Microsoft Docs (このリンク) を参照してください。
また、Out-File やその他の方法を使用することもできますが、ここでは詳しく説明しません。
もちろん、ここでハードコードされたテキストの代わりに、ファイル名を含む $Variable を使用することもできます。
これは、空の文字列を内容とするファイルを作成するだけです。
または、コマンド ラインで作業している場合は、次のように行うことができます:
"" | Set-Content x:\path\filenamehere.xml
最も適切なスクリプトの使用方法と考えられる方法を最初に示すことが良いと考えました。
ファイル作成の失敗をテストしたい場合は、ファイルを作成するコマンドレットに try {} catch {} ステートメントとパラメータおよび値「-ErrorAction Stop」を使用できます。
以下に簡単な例を示します。
「百聞は一見にしかず」ということで、.ps1 スクリプト ファイルに格納されたこの例を実行している PowerShell ISE のスクリーン ダンプを示します。
可能な PathType 値を列挙する
-PathType の可能な列挙値を見るためのちょっとした「トリック」は、次のように存在しないものを使用することです。
そして、次のように書かれている部分に注目してください。
PS E:\temp> ::Exists('E:\temp\csv1.csv')True
PowerShellでは、「System」名前空間はオプションなので、単に「Io.File」を使用することもできます。
注意すべき点は、このメソッドではフルパスが必要なことです。 IO.File Exists()メソッドでファイルがカレントディレクトリにあるかどうかを確認するには、次のような方法があります。