Invoke-Command를 통해서 실행 후 결과값 받아 오기와 변수로 실행 구문 넘기기


참조 URL
  1. http://stackoverflow.com/questions/3490907/process-list-of-commands-on-remote-machine-with-invoke-command

 

 

 

 파워쉘을 통해 원격 서버의 서비스를 통제해야 하는 필요성이 있어서 아래와 같은 스크립트를 만들게 되었다. 처음에는 Invoke-Command를 통해 Native 한 명령으로 해결을 하였지만 확장성을 위해 변수로 처리하려 하였으나 잘되지 않다가 "$ExecutionContext.InvokeCommand.NewScriptBlock"을 사용하여 ScriptBlock를 만들어 실행하이 원하는 되로 변수화로 담겨 실행할 수 있게 되었다.

 

 

# 서버 리스트

$serverNameList = "servver1,servver2";

# 서버 리스트 목록
$ServerNames = $serverNameList.Split(',');

 

# 서비스 리스트

$serviceNameList = "ServiceName1|ServiceName2"

# 서비스 리스트 목록
$serviceNames = $serviceNameList.Split('|');

 

# 실행할 서비스 계정 정보 사용자 에게 얻기

$myServiceCredential = Get-Credential;

 

--------------------------------------------------------------------------------

-- 각각의 서버마다 파워쉘로 원격 실행

--------------------------------------------------------------------------------

Foreach($ServerName in $ServerNames) {

    # 입력받은 계정으로 새로운 파워쉘 세션을 만든다.

    $remoteSession = new-pssession -ComputerName $ServerName -Credential $myServiceCredential;
    Foreach($serviceName in $serviceNames) {

        # 동적으로 실행 구문 만들기
        $invokeCommand = 'Start-Service "' + $serviceName + '" -PassThru';

        # ScriptBlock로 만든다.

        $scriptblock = $ExecutionContext.InvokeCommand.NewScriptBlock($invokeCommand);

        # 원격 서버에서 실행 되도록 한다.
        $invokeResult = invoke-command -ScriptBlock $scriptblock -Session $remoteSession;

 

        # 결과값으로 성공 여부를 판단한다.

        if ($invokeResult.Status.Equals("Running")){
            Write-Host "true";
        } else {
            Write-Host "false";
        }
    }

    $temp = Remove-PSSession $remoteSession;
}

--------------------------------------------------------------------------------

 

 

--------------------------------------------------------------------------------

-- 서버 목록을 한번에 넘겨 파워쉘로 원격 실행

--------------------------------------------------------------------------------

Foreach($serviceName in $serviceNames) {

    # 동적으로 실행 구문 만들기
    $invokeCommand = 'Start-Service "' + $serviceName + '" -PassThru';

    # ScriptBlock로 만든다.
    $scriptblock = $ExecutionContext.InvokeCommand.NewScriptBlock($invokeCommand);

    # 원격 서버에서 실행 되도록 한다.
    $invokeResult = Invoke-Command -ComputerName $ServerNames -Credential $myServiceCredential -ScriptBlock $scriptblock


    if ($invokeResult.Status.Equals("Running")){
        Write-Host "true";
    } else {
        Write-Host "false";
    }

}

--------------------------------------------------------------------------------

 

 



ISE 모드로 실행하여 편집하면 편리하게 사용할 수 있다.

 


+ Recent posts