2009-11-19 7 views
4

...가져 품목 내가 예를 들어 기능이있는 경우

function foo() 
{ 
    # get a list of files matched pattern and timestamp 
    $fs = Get-Item -Path "C:\Temp\*.txt" 
       | Where-Object {$_.lastwritetime -gt "11/01/2009"} 
    if ($fs -ne $null) # $fs may be empty, check it first 
    { 
     foreach ($o in $fs) 
     { 
     # new bak file 
     $fBack = "C:\Temp\test\" + $o.Name + ".bak" 
     # Exception here Get-Item! See following msg 
     # Exception thrown only Get-Item cannot find any files this time. 
     # If there is any matched file there, it is OK 
     $fs1 = Get-Item -Path $fBack 
     .... 
     } 
    } 
    } 

예외 메시지는 ... 기본적으로 The WriteObject and WriteError methods cannot be called after the pipeline has been closed. Please contact Microsoft Support Services.

, 나는 함수 내에서 다시 Get-Item를 사용하거나 할 수없는 폐쇄 된 파이프 라인 오류와 함께 실패 루프를 사용하여 다른 폴더의 파일 목록을 가져옵니다.

설명과 문제를 해결하는 올바른 방법은 무엇입니까?

그런데 PS 1.0을 사용하고 있습니다.

+0

David, 코드 샘플의 마지막 줄에서 Get-Item을 호출하면 백업 파일이 'C : \ temp \ test \'디렉토리에 만들어 졌는지 확인하기 만하면됩니까? – MagicAndi

+1

$ fs = @ (Get-Item c : \ temp \ *. txt |? {$ _. lastwritetime -)}와 같은 배열 부분 표현식 연산자를 사용하여 if ($ fs -ne $ null) gt; "11/01/2009"}}); foreach ($ file in $ fs) {...} –

+1

해결 방법이 있습니다. 하지만 아무도 여기서 무슨 일이 일어나는 지 알아? – stej

답변

3

foreach 및 스칼라 널 (null)의 문제에 대한 추가 정보를 원하시면

function foo() 
{  
    # Get a list of files matched pattern and timestamp  
    $fs = @(Get-Item C:\Temp\*.txt | Where {$_.lastwritetime -gt "11/01/2009"}) 
    foreach ($o in $fs) { 
     # new bak file 
     $fBack = "C:\Temp\test\$($o.Name).bak" 
     if (!(Test-Path $fBack)) 
     { 
      Copy-Item $fs.Fullname $fBack 
     } 

     $fs1 = Get-Item -Path $fBack 
     .... 
    } 
} 

이 이미 제안 된 내용의 단지 작은 변화이지만, 코드를 조금 더 간단 할 몇 가지 기술을 사용하여 값은 blog post입니다.

+0

키이스, 내 표를 얻습니다. + 깨끗한 구현을 위해 +1. – MagicAndi

1

위의 코드를 약간 수정하여 백업 파일을 만들었지 만 예외가 발생하지 않고 루프 내에서 Get-Item을 성공적으로 사용할 수 있습니다. 내 코드 :

function foo() 
{ 
    # get a list of files matched pattern and timestamp 
    $files = Get-Item -Path "C:\Temp\*.*" | Where-Object {$_.lastwritetime -gt "11/01/2009"} 
    foreach ($file in $files) 
    { 
     $fileBackup = [string]::Format("{0}{1}{2}", "C:\Temp\Test\", $file.Name , ".bak") 
     Copy-Item $file.FullName -destination $fileBackup 
     # Test that backup file exists 
     if (!(Test-Path $fileBackup)) 
     { 
      Write-Host "$fileBackup does not exist!" 
     } 
     else 
     { 
      $fs1 = Get-Item -Path $fileBackup 
      ... 
     } 
    } 
} 

저는 PowerShell 1.0도 사용하고 있습니다.

+0

철자가 틀린 것은 아닙니다. 코드를 수정합니다. 내 것은 여전히 ​​작동하지 않습니다. 공백이 포함 된 $ fileBackup의 경우에 문제가 발생할 수 있는지 확인하십시오. 내 테스트 케이스가 $ fileBackup "C : \ temp \ copyof test file.txt.bak" –

+0

David, 백업 파일의 잘못된 파일 경로에 사과드립니다. 나는 나의 대답을 업데이트했다. – MagicAndi

+0

확인. 나는 그 문제를 안다. 대상에 백업 파일이 없습니다. Get-Item 두 번째 시간은 비어있을 때 예외가 발생합니다. Copy-Item을 제거하고 dest에 파일이 없는지 확인하면 예외가 표시됩니다. 문제는 Get-Item이 처음으로 비어 있거나 null 일 수 있지만 두 번째가 아닌 것입니다. 권리? 문제를 반영하기 위해 코드를 다시 편집했습니다. –