2016-10-11 17 views
0

既存のファイルを追加(または作成してから追加)するスクリプトを作成しようとしています。このファイルは別のシステムから接続されているので、ファイルが追加されている間にファイルが読み込まれる状況を避けるために、共有ロックを作成しています。スクリプトは私が理解できない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()メソッドは失敗しませんが、ファイルは変更されません。

+0

、別のコメント:私はオープン、CreateNew、または切り捨てのいずれかでAppendメソッドを交換する場合、それはcatchブロックをトリガしないOpen()呼び出しの後に無限ループを追加します。 Append、Create、およびOpenOrCreateメソッドはそうではありません。 – Cpu1

答えて

1

上記のコードをスクリプトとして実行すると、スクリプト(またはより正確にはPowerShellプロセス)が終了すると、ファイル/ハンドルが自動的に閉じられます。ハンドルを開いたままにするには、スクリプトを実行したままにする必要があります。

$ErrorActionPreference = "Stop" 
try { 
    $writeStream = [IO.File]::Open($FilePath,[IO.FileMode]::Append,[IO.FileAccess]::Write, [IO.FileShare]::None) 
    do { 
     Start-Sleep -Milliseconds 100 
    } while ($true) 
} catch { 
    Write-Host "Unable to create a lock on this file" 
} 
+0

申し訳ありませんが、これは私の最初のスクリプトですので、あなたの答えを理解していない可能性があります...私の問題はファイルにロックを維持していない、問題は:ファイルが既にpowershellによってロックされている場合、それを検出しない。私が期待するように、Openステートメントは失敗しません。 – Cpu1

+0

再生できません。あなたが何をしているのか、正確にあなたがそれをやっているのかを記述してください。 –

+0

私はもう少しテストをしました。私はそれがバグか、そういう形に設計されていると思います。自分の発見を元の投稿に追加しています。 – Cpu1

関連する問題