2012-11-01 2 views
1

스크립트에서 함수를 호출하는 것과 동일한 스크립트 내에서 함수를 만드는 데 도움이 필요합니다. 이 코드를 테스트했습니다 :함수를 만들고 동일한 스크립트에서 호출하는 방법

function FUNC1() { 
$source="C:\Folder\file.txt" 
$destination="\\Server\folder" 
$searchFiles = Get-Content "$source" 
foreach($filename in $searchFiles){ 
    Test-Path $destination\$filename 
    } 
} 

function FUNC2() { 
$source="C:\Folder\file.txt" 
$destination="\\Server\folder" 
$searchFiles = Get-Content "$source" 
foreach($filename in $searchFiles){ 
    Move-Item C:\folder\$filename $destination -force 
    } 
} 

if (!(FUNC1)) {FUNC2} 

그러나 FUNC1을 false로 테스트하면 아무 것도 움직이지 않습니다. 함수에서 코드를 별도로 실행하면 모든 것이 제대로 작동합니다. 그들을 기능으로 합치면 작동하지 않습니다. 별도의 function.ps1을 호출하고 싶지는 않지만, 코드 내에서 호출되는 함수를 갖고 싶습니다. 감사!

답변

1

FUNC1은 두 개 이상의 파일 이름이있는 경우 $searchFiles에 배열 (부울 값)을 반환합니다.

$false 값이 여러 개인 경우에도 마찬가지입니다 (배열에 포함 된 값이 아니라 배열을 테스트하기 때문에). 이것을 부정하면 (!) 항상 $false이되어 if의 내용이 실행되지 않습니다.

당신의 접근 방식은 모든 테스트를 수행 한 다음 그 파일에 대해 테스트가 보여준 것이 무엇이든간에 매우 이상하게 보입니다. , $source의 모든 라인을 반복 그 이름의 파일이 대상에 존재하는 경우를 무시하고 대상에 파일을 이동합니다

Get-Content "$source" | 
    Where-Object { -not (Test-Path $destination\$_) } | 
    Foreach-Object { Move-Item C:\folder\$_ $destination } 

: 내가 좋아하는 뭔가를 기대했을 것이다.

+0

Richard, Thank you! 나는 이것에 처음이고 나가 그것을 한 방법이 그것을하는 방법을 알고 있던 유일한 방법이었다. 당신은 저에게 더 나은 선택권을주었습니다, 그것은 실제로 효과가 있습니다! 이 명령들을 더 잘 이해할 수 있도록 이들 명령을 반드시 읽을 필요가 있습니다. 다시 한 번 감사드립니다! – CaptHowdy

0

구문이 혼란 스럽습니다. "! (FUNC1)"은 항상 $ false입니다. FUNC1의 결과는 배열이 가능하고 $ null이 아니므로 true로 간주되므로! (FUNC1)은 $ false가됩니다. 이 두 기능을 하나로 결합하면됩니다.

function FUNC1() { 
    $source="C:\Folder\file.txt" 
    $destination="\\Server\folder" 

    $searchFiles = Get-Content "$source" 
    foreach($filename in $searchFiles){ 
     if(-not (Test-Path $destination\$filename)) 
     { 
      Move-Item C:\folder\$filename $destination -force 
     } 
    } 
} 
관련 문제