2012-05-16 3 views
2

인사말!PowerShell 코드는 대화 형으로 작동하지만 스크립트 내에서 작동하지 않습니다.

그래서, 난 그냥 파워 쉘 프로그래밍의 내 일상에 있었고, 난이 작은 친구에 도착 :

Get-WmiObject : Invalid class 
At line:184 char:19 
+ $RECApp = gwmi <<<< Win32_product | ? {$_.Name.Contains($Application)} 
+ CategoryInfo   : InvalidOperation: (:) [Get-WmiObject], ManagementException 
+ FullyQualifiedErrorId: GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand 

코드가 스크립트에서 실행될 때 재미있는 것은이 오류 만 표시됩니다된다 명령 줄에 수동으로 입력하면 같은 코드가 작동합니다. 이 스크립트가 실행중인 원격 시스템과 관련이 있는지는 알 수 없지만 수동으로 입력 할 때 작동하지만 스크립트에서 실행될 때는 작동하지 않는 이유는 무엇입니까?

Enter-PSSession -ComputerName $serverName 
$App = gwmi Win32_product | ? {$_.Name.Contains($Application)} 
$App.Uninstall(); 
exit 

가 요약하면,이 코드 명령 줄에 수동으로 입력 매력처럼 작동하지만 때 양식에게 나는 위의 오류를 얻을 수있는 스크립트를 실행 않는 이유 : 난 당신이 여기 내 코드의 조각을 얻을 것이다?

감사합니다.

답변

4

Enter-PSSession는 대화식 용도로만 사용됩니다. 이 줄을 스크립트에 넣으면 후속 줄은 이 아니며 원격 세션에서 실행되는이 아닙니다. 당신이 스크립트에서 원격으로 일부 스크립트를 실행하려면이 대신 같은 것을 할 것입니다 :

$session = New-PSSession -ComputerName $serverName 
Invoke-Command -Session $session { 
    param($name) 

    $App = gwmi Win32_product | ? {$_.Name.Contains($name)} 
    $App.Uninstall(); 
} -arguments $application 

거기 잡았다 조금있다 나는 그 변수가 않기 때문에 Invoke-Command에 인수로 $application을 통과해야으로 원격 세션에 존재하지 않습니다. 조금 다시 스테핑,이 같은 비트 간단한 위를 작성할 수 : 로컬 컴퓨터에 다시 서버 및 필터링의 모든 win32_product 물체를 당기는 것을

$app = gwmi -computer $servername win32_product | ? { 
     $_.name.contains($application) 
} 

자,이에 대한 문제입니다. 이것은 불필요한 많은 네트워크 트래픽입니다. 그것은 빨리 당신이 원격 컴퓨터에 필터링 할 수 있다면 수, 그래서 그것을 좀 더 수정할 수 있습니다 것입니다 :

$app = gwmi -computer $servername -query ` 
    "select * from win32_product where name = '$application'" 
$app.Uninstall() 

을 이제에만 win32_product 원격 컴퓨터에서 검색됩니다합니다. 위의 gwmi -computer 변형을 테스트하지 않았으므로 기술과 구문을 더 잘 설명합니다. 당신은 그것으로 조금 연주해야 할 수도 있습니다.

+0

글쎄, 누군가 당신의 질문에 대한 좋은 설명을 해줄 때 그것을 좋아할 것입니다. 고마워요 :) 추신. 이 후에 세션을 종료 할 필요가 있습니까? –

+1

Aaah 이걸 가지고있어. Get-PSSession으로 활성 세션을 찾으면'Remove-PSSession'으로 제거한다. 그래서 그것들을 파이프하여'Get-PSSession | Remove-PSSession' –

관련 문제