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 모드로 실행하여 편집하면 편리하게 사용할 수 있다.
'기타' 카테고리의 다른 글
Pentaho Mondrian - Open source analysis OLAP server (0) | 2013.10.25 |
---|---|
[PowerShell] Import-Module - 파워쉘 모듈화 (0) | 2013.10.17 |
내컴에선 잘되던데? - vagrant로 서버와 동일한 개발환경 꾸미기 (0) | 2013.09.30 |
Windows 8.1 RTM and Windows 2012 R2 RTM (0) | 2013.09.11 |
Windows 8에서 원격 연결이 되지 않을 때 - Windows 8 RP with Microsoft Account fails ( Remote Desktop ) (1) | 2013.09.03 |