2011-10-27 2 views
0

나는 실행중인 주 스크립트가 있습니다. 이 작업은 다른 powershell 스크립트로 채워진 디렉토리를 통해 읽히며, 점은 모두 포함하고 점으로 구분 된 파일 이름의 첫 번째 부분으로 구성된 미리 정의 된 메소드를 실행합니다. 예 :점으로 표시된 파일에서 로컬 함수 호출

  1. 실행
  2. Master.ps1 도트 소스를 master.ps1 \ 리소스 \의 sub.ps1 Sub.ps1는
  3. Master.ps1 실행 'dosub'dosub '라는 함수를 정의하고있다
  4. . 'Invoke-Expression 사용

subps.p1에서 정의 된 함수는'saysomething '입니다. 구현 된 '도저'는 'sayomething'에 대한 호출입니다.

The term 'saysomething' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

왜 'dosub'방법은 동일한 파일에 정의 된 방법 'saysomething'를 찾을 수 없습니다 :

내 문제는 내가 오류가 계속입니까?

master.ps1 :

$handlersDir = "handlers" 

$handlers = @(Get-ChildItem $handlersDir) 

foreach ($handler in $handlers) { 

    . .\$handlersDir\$handler 

    $fnParts = $handler.Name.split(".") 

    $exp = "do" + $fnParts[0] 
    Invoke-Expression $exp 
} 

sub.ps1 :

function saysomething() { 
    Write-Host "I'm here to say something!" 
} 


function dosub() { 
    saysomething 
    Write-Host "In dosub!" 
} 
+0

귀하의 예를 나를 위해 일합니다. 귀하가 게시 한 내용이 귀하의 시스템과 정확히 일치합니까? – zdan

답변

0

귀하의 코드 내 시스템에서 작동합니다.

$handlersDir = "handlers" 

$handlers = @(Get-ChildItem $handlersDir) 
foreach ($handler in $handlers) 
{ 
    . .\$handlersDir\$handler 

    $exp = "do" + $handler.BaseName 
    Write-Host "Calling $exp" 
    & $exp 
} 

참고 BaseName 속성을 사용할 수 : 그러나 당신은 그것을 조금 단순화 할 수 있습니다. Invoke-Expression을 사용할 필요도 없습니다. 이름이 지정된 명령을 호출 할 수 있습니다 (&) 연산자.

+0

글쎄요, 저에게 이상한 부분은 "In dosub"의 Write-Host 출력을보고 있다는 것입니다. 뿐만 아니라 '말'somethingomething '은 인식되지 않습니다 ...'오류. 즉, 내 마스터 스크립트가 '하위'파일에서 코드를보고 소싱하고 실행하고 있음을 의미합니다. 이는 "정상적인"환경 구성 오류를 배제하고 더 신비한 가능성만을 남깁니다. 나는 다른 기계에서 그것을 시험해보고 내가 더 좋은 행운이 있는지 알아 보겠다. –

+0

PowerShell v2에 대한 테스트를 수행했습니다. v1에 오셨습니까? –

0

귀하가 제공 한 것은 필요에 따라 작동합니다. 아마 당신의 컴퓨터에 적절한 디렉토리가 없을 것입니다. 또는 다른 것을 실행하고 다른 (작동하는!) 코드를 여기 게시하십시오. 대신 당신이 할 수있는 위의

. .\$handlersDir\$handler 

:

당신은 또한 다음과 같은 수정 할 수 있습니다

. $handler.fullname 

을 대신 파일 이름의 분할은 할 수있다 :

$exp = "do" + $handler.basename 
+0

basename 포인터를 보내 주셔서 감사합니다. 지금 바꿀 것입니다. 코드에 관해서는, 파일을 그대로 바꿔서 붙여 넣을 것입니다. –

+0

@QuinnPeters - 저에게 도움이됩니다. 핸들러 디렉토리와 그 안에 파일이 있는지 확인하십시오. "환경"에 문제가있을 수 있습니다. – manojlds

관련 문제