

スクリプトやRPAが出力するログファイルを、PowerShellの`Get-
Content`に`-Wait`オプションを付けてリアルタイムで見ています。時々、ログファイルが開けないというエラーでスクリプト、RPAが異常終了してしまう事象が発生していて、同僚からは`Get-
Content`でファイルを開いているからだと言われるのですが、私は、UNIX系の`tail`と同じく`Get-
Content`がファイルに排他ロックを掛けることはないと考えています。ただ、現時点で根拠になる情報を見つけられていません。

PowerShellがオープンソース化されているので、最終的にはソースを見れば解決するのだろうと思うのですが、はるかに力及ばずで目的地にたどり着けません。PowerShellのドキュメントなど(または、私が誤解していて「`Get-
Content`は排他ロックが掛かる。」という情報)はありませんでしょうか。


CC BY-SA 4.0
2022-07-07T11:08:18.850
89814
2022-07-07T13:10:20.800
2022-07-07T13:10:20.800
4236
53420
question
windows powershell
PowerShellのGet-Contentは対象のファイルをロックするのでしょうか。


ファイルオープンにおいて、UNIX・Windows双方で使用される`fopen()`は既定で排他を行いませんし、標準では排他手段が提供されていません（glibc拡張はあるようです）。

しかし、これとは別にWindowsに用意されている[`CreateFile()`](https://docs.microsoft.com/en-
us/windows/win32/api/fileapi/nf-fileapi-
createfilew)（歴史的にこのAPIでファイルオープンを行います）は既定で排他を行い、必要に応じて共有アクセスを認める仕様です。加えて、読み込み許可と書き込み許可に分かれています。

いくら`Get-Content
-Wait`側が排他せず共有アクセスを認めていても、書き込み側のプログラムが雑に`CreateFile()`をデフォルト引数で呼び出すことで排他指定してしまった場合は、ロックが競合してファイルオープンに失敗します。

* * *

PowerShellのソースコードは自信がありませんが[この辺り](https://github.com/PowerShell/PowerShell/blob/v7.2.5/src/System.Management.Automation/namespaces/FileSystemProvider.cs#L6739)で`FileShare.ReadWrite`つまり読み込みも書き込みも許可を指定しているような気がします。


CC BY-SA 4.0
2022-07-07T13:10:09.270
89817
2022-07-07T13:10:09.270
4236
89814
answer