2012-05-20 2 views
1

프로덕션 환경에서 powershell cmdlet을 분석하는 가장 좋은 방법은 무엇입니까? 레지스트리의Powershell : 생산/양호 예외 처리에서 디버그

  1. 쓰기 LOF
  2. 등록 COM DLL이
  3. 확인 IIS AppPools
  4. 시작 Windows 서비스

& 값 - 다음이하는 스크립트를 작성한다고 가정 ... 무언가가 잘못되어 간다면, 사용자에게 알려주는 모범 사례는 무엇입니까? ot 문제를 추적하고 디버깅 할 수 있습니까?

가정 사용자 자격 증명은 어떤 이유로 에 대한 AppPool을 생성에 실패하고 난 그 시간에 처리를 중지 할 플러스 내가 이전에 행한 일을 을 롤백합니다.

자세한 단계별로 자세한 정보를 수집하는 자세한 방법 + 로깅은 자세한 방법입니까?

+0

전체 소스 코드 샘플이 포함 된 최종 솔루션은 무엇입니까? – Kiquenet

답변

2

생산 수준의 PowerShell 프로그램에 사용하는 poshcode (http://poshcode.org/3270)에 게시 한 Write-Log 함수를 작성했습니다. 또는 Start-Transcript을 사용하여 콘솔에 표시된 거의 모든 것을 파일에 기록 할 수 있습니다. 당신이 Out-Host 같은 ping.exe localhost | Out-Host에 파이프하여 호스트 출력 API를 통해 강제하지 않는 한 외부 프로그램 출력을 기록하지 않습니다

  1. - Start-Transcript에 대해 몇 개는있다.
  2. 모든 호스트에서 지원되지는 않습니다. 예를 들어 PowerGUI에서는 지원하지 않으므로 $host을 사용하여 호스트 검사를 추가해야합니다.

일반적으로 오류 처리에 사용하는 패턴은 모든 것을 try/catch로 래핑하는 것입니다. 예외 개체는 catch 블록에 $_으로 사용할 수 있습니다. 오류, 메시지, 줄 및 열 번호 등에 관한 모든 내용이 포함됩니다.

$ErrorActionPreference ~ Stop 또한 모든 cmdlet에서 종료 오류가 발생하여 스크립트가 계속되지 않도록합니다. 그것은 다음과 같습니다

$ErrorActionPreference = "Stop" 
try { 
    # Write lof of registry values 
    New-Item -Path HKCU:\Software\MyTest -ItemType Directory 
    New-ItemProperty -Path HKCU:\Software\MyTest -Name MyTestValue -Value Test 

    # Register COM Dlls 
    regsrv32 my.dll 
    if ($LASTEXITCODE -ne 0) { throw "Failed to register my.dll" } 

    # Make IIS AppPools 
    IIS:\>New-WebAppPool NewAppPool 

    # Start Windows Services 
    Start-Service -Name MyService 
} catch { 
    Write-Log ("Script failed. The error was: '{0}'." -f $_) 
} 

가 롤백하는 ... 레지스트리 거래 (이상 Vista를 가정 이상)를 지원하기 때문에 롤백 레지스트리 작업입니다 쉽게 할 수있는 유일한 것은 쉬운 일이 아니다. 데이터베이스와 같은 트랜잭션을 생성하고 오류가 발생하면 롤백 할 수 있습니다. 언급 한 작업의 나머지 부분에는 롤백하기위한 특정 코드가 필요합니다. 이 같은 catch 블록에 롤백 코드를 추가 할 수 있습니다

} catch { 
    # Undo the registry transaction. 
    # Unregister the DLL. 
    # Delete the App pool if it exists. 
    # Stop the windows service. 
} 
+0

한 가지 - 35 개의 서로 다른 중첩 모듈이 있습니다. 그리고 모든 모듈은 Import-Module 호출을 통해로드 된 다음 특정 작업과 관련된 특정 함수가 순서대로 호출됩니다. 그럼, 나는 여전히 모듈의 각 함수 안에 try/catch를 넣어야합니까? 아니면 모든 호출 시퀀스를 하나의 tr/catch로 묶어야합니까? –

+0

@AngshumanAgarwal 보통 따라야 할 패턴은 모듈 함수에서 try/catch를 사용하는 것입니다. 뭔가 잘못 되었다면 예외 메시지와 함께 메시지를 던지십시오. 그것은 호출자의 catch 블록에서 잡힐 것이고 다시 계산할 수있는 pseudo stacktrace가있을 것입니다. –

+0

hmm..makes sense –

2

을 직접 레지스트리 조작은 하나에 PowerShell에서의 트랜잭션 지원을 사용하는 스크립트의 전반적인 성공에 따라 변경 내용을 커밋하거나 레지스트리를 롤백 트랜잭션을 취소 할 수 있습니다 들어 변경 예:

try { 
    $ErrorActionPreference = 'Stop' # convert all errors to terminating errors 
    Start-Transaction 
    Set-ItemProperty Acme -Name Count -Value 99 -UseTransaction 
    Remove-ItemProperty Acme -Name InstallDir -UseTransaction 
    New-Item Acme2 -UseTransaction 
    New-ItemProperty Acme2 -Name Count -Value 2 -UseTransaction 
    New-ItemProperty Acme2 -Name InstallDir -Value 'C:\Program Files\Acme2' -UseTx 

    ... do other stuff ... 

    Complete-Transaction 
} 
catch { 
    Undo-Transaction 
    ... Log failure ... 
} 
관련 문제