2016-10-11 3 views
0

기존 파일에 추가 (또는 생성 한 후 추가)하는 스크립트를 만들려고합니다. 이 파일은 다른 시스템에서 연결되어 있으므로 파일을 추가하는 동안 파일을 읽지 않는 상황을 피하기 위해 공유 금지를 만듭니다. 스크립트는 내가 이해할 수없는 한 가지 예외로 완벽하게 작동하는 것 같습니다. 다음 코드 예제는 다음과 같습니다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 블록을 유발하지 않는 조건이 하나있다 - 파일이 이미 PowerShell 콘솔을 통해 잠겨있는 경우이 코드가 스크립트에서 실행하고 직접 창에 입력되지 않은 경우. Excel에서 파일을 먼저 열면 catch 블록이 항상 작동합니다. 이 코드를 콘솔에 입력하여 실행하면 항상 작동합니다. 그러나 먼저 콘솔에이 파일을 입력하여 파일을 잠근 다음 동일한 작업을 시도하는 스크립트를 실행하면 예외가 throw되지 않으며 catch 블록이 트리거되지 않습니다.

무엇이 여기에 있습니까?

업데이트 : 추가 문제 해결을 수행했으며 여기에 대한 결과가 있습니다. 첫째, 어떻게이 문제를 재현하는 방법 :

  • test1.ps1라는 이름의 스크립트를 작성 TEST.TXT라는 이름의 파일을 작성 콘솔은
  • 실행이 명령을 위의 코드를 삽입 :

    [System.IO.FileStream]$file2 = [System.IO.File]::Open("test.txt", [System.IO.FileMode]::Append,[System.IO.FileAccess]::Write, [System.IO.FileShare]::None) 
    
  • 이제 test1.ps1 스크립트

에게 실행

그리고 스크립트의 catch 블록이 내 작업 환경에서 트리거되지 않습니다! 나는 집에서 테스트를했으며 예상대로 작동합니다. 그래서 나는 다시 일하러 가서 PC의 로컬 드라이브에있는 파일을 사용하여 다시 테스트했다. 작동하지 않는 한 가지 차이점은 내가 작업하고 있던 파일이 회사의 DFS 네임 스페이스에 있다는 사실이었습니다. 내 PC에 매핑 된 로컬 네트워크의 드라이브에서 시도했는데 정상적으로 작동했습니다.

그래서 어떤 이유로 든 PowerShell은 DFS 네임 스페이스에서 PowerShell에 의해 잠긴 파일에 반응하지 않습니다. 시도한 다른 모든 응용 프로그램은 잠금을 감지하지 못합니다. 메모장과 Excel이 파일 읽기를 거부하고 PDF 문서에서이를 테스트 할 때 Acrobat도 열지 않습니다. 그러나 PowerShell은 불평하지 않으며 오류없이 모든 후속 메서드를 처리합니다. CopyTo()Flush() 메서드는 실패하지 않지만 파일은 변경되지 않습니다.

+0

그리고 다른 코멘트 : I 열기, CreateNew 또는 자르기, 그것은 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