既存のファイルを追加(または作成してから追加)するスクリプトを作成しようとしています。このファイルは別のシステムから接続されているので、ファイルが追加されている間にファイルが読み込まれる状況を避けるために、共有ロックを作成しています。スクリプトは私が理解できない1つの例外を除いて完全に動作するようです。ここでのコードサンプルがあります: - ファイルが既にPowerShellのコンソールを介してANDこのコードはスクリプトから実行し、直接ウィンドウで入力されていない場合、ロックされている場合PowerShellスクリプトでファイルストリームを開くときに予期しない動作が発生する
$ErrorActionPreference = "Stop"
try
{
[System.IO.FileStream]$file1 = [System.IO.File]::Open("test.txt", [System.IO.FileMode]::Append,[System.IO.FileAccess]::Write, [System.IO.FileShare]::None)
}
catch
{
Write-Host "Unable to create a lock on this file"
}
catchブロックをトリガしませんつの条件があります。 Excelで最初にファイルを開くと、catchブロックが常に機能します。このコードをコンソールに入力して実行すると、常に動作します。しかし、最初にファイルをロックしてコンソールに入力し、同じことを試みるスクリプトを実行すると例外がスローされ、catchブロックはトリガーしません。
私はここで何が欠けていますか?
更新:追加のトラブルシューティングを行いました。ここに私の発見があります。まず、どのようにこれを再現するために:
[System.IO.FileStream]$file2 = [System.IO.File]::Open("test.txt", [System.IO.FileMode]::Append,[System.IO.FileAccess]::Write, [System.IO.FileShare]::None)
:
実行にそれにコンソールで次のコマンドを上記のコードを配置し、
test1.ps1
という名前のスクリプトを作成します- test.txtという名前のファイルを作成します。
は今
test1.ps1
スクリプト
スクリプトのcatchブロックが私の作業環境でトリガされません!私は自宅でテストし、期待どおりに動作します。そこで私は仕事に戻って、今度はPCのローカルドライブ上のファイルを使って再びテストしました。私が働いていたファイルが私の会社のDFS名前空間に置かれていたという事実が、それがうまくいかなかったという違いがあります。私は自分のPCにマップされているローカルネットワークのドライブで試してみましたが、うまくいきました。
何らかの理由でPowerShellは、想定されているようにDFS名前空間でPowerShellによってロックされたファイルに反応しません。私が試した他のすべてのアプリはロックを検出します:メモ帳とExcelはファイルの読み込みを拒否し、PDF文書でそれをテストしたときにもAcrobatは開きませんでした。しかし、PowerShellはエラーを出さず、後続のすべてのメソッドをエラーなく処理します。これは効果がありません。 CopyTo()
とFlush()
メソッドは失敗しませんが、ファイルは変更されません。
、別のコメント:私はオープン、CreateNew、または切り捨てのいずれかでAppendメソッドを交換する場合、それはcatchブロックをトリガしない
Open()
呼び出しの後に無限ループを追加します。 Append、Create、およびOpenOrCreateメソッドはそうではありません。 – Cpu1