참조 URL
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 모드로 실행하여 편집하면 편리하게 사용할 수 있다.