Add-PSSnapin을 호출하기 전에 PowerShell 스냅인이 이미로드되었는지 확인하는 방법


90

때때로 한 번에 하나씩 함께 실행되는 PowerShell 스크립트 그룹이 있습니다. 각 스크립트에는 특정 스냅인이로드되어야합니다.

지금은 각 스크립트가 Add-PSSnapin XYZ처음에 호출 되고 있습니다.

이제 여러 스크립트를 연속적으로 실행하면 후속 스크립트가 다음을 던집니다.

Windows PowerShell 스냅인 XYZ가 추가 되었기 때문에 추가 할 수 없습니다. 스냅인의 이름을 확인하고 다시 시도하십시오.

Add-PSSnapin을 호출하기 전에 각 스크립트에서 스냅인이 이미로드되었는지 확인하도록하려면 어떻게해야합니까?

답변:


133

Snapin을 쿼리하지만 찾을 수없는 경우 오류가 발생하지 않도록 PowerShell에 알리는 다음과 같은 작업을 수행 할 수 있어야합니다.

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}

아하! 이것이 바로 제가 필요했던 것입니다. 감사합니다! 나는 실험에서 이와 비슷한 것을 시도했지만 -ErrorAction SilentlyContinue에 대해 몰랐습니다.
joshuapoehls

2
SilentlyContinue는 기본적으로 스냅인을 찾지 못하는 경우 Get-PSSnapin이 조용히 null을 반환하지 않기 때문입니다. 오류가 있습니다.
Rich

1
게으른 사용자 : 이 문서 에서는 스냅인을로드하기 전에 등록되었는지 확인하는 방법에 대한 전체 코드 예제를 제공합니다.
herzbube

21

Scott은 이미 답을주었습니다. 어쨌든로드하고 이미로드 된 경우 오류를 무시할 수도 있습니다.

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
스냅인이 설치되지 않는 것과 같은 다른 이유로로드되지 않은 경우에도 자동으로 계속됩니다. 스크립트를 사용하는 사람들의 문제를 진단하기 어려울 수 있습니다.
Graham Ambrose 2011 년

맞습니다.이 경우 스냅인이 등록되었는지 먼저 확인할 수 있습니다.
셰이 레비

4

놀랍게도 스크립트가 종속성을 지정하는 기본 방법 인 #REQUIRES -PSSnapin Microsoft.PowerShell...주석 / 전 처리기 지시문을 언급 한 사람은 아무도 없습니다 . 마찬가지로 -RunAsAdministrator,를 사용하는 모듈 -Modules Module1,Module2및 특정 Runspace 버전을 사용하여 상승이 필요할 수 있습니다.

입력하여 자세히 알아보기 Get-Help about_requires


이 솔루션은이 작업을 수행하는 "올바른"방법 인 것 같습니다.
Grax32

1
내가 가진 문제는 필요한 스냅인이로드되지 않은 경우 Powershell이 ​​오류를 반환하고 그렇지 않은 경우 스냅인이로드되는 것이 모든 사람이 원하는 것이라고 가정한다는 것입니다.
Dwayne Driskill

1
모듈은 더 최신이며 PSSnapins가 아니라 필요에 따라 자동으로로드되는 모듈입니다. 맞습니다. 그러나 스냅인없이 작동하는 스크립트 부분을 실행해도 적어도 아무것도 깨지거나 흩어지지 않습니다.
알렉세이

3

@ScottSaad의 코드 샘플을 시도했지만 작동하지 않았습니다. 나는 그 이유를 정확히 알지 못했지만 수표는 신뢰할 수 없었고 때로는 성공하고 때로는 그렇지 않았습니다. 속성 에서 Where-Object필터링 을 사용하는 Name것이 더 효과적 이라는 것을 알았습니다 .

if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) {
    Add-PSSnapin $SnapinName 
}

의 코드 예의 .


1

Scott Saads는 작동하지만 이것은 나에게 다소 빠른 것 같습니다. 나는 그것을 측정하지 않았지만 오류 메시지를 생성하지 않기 때문에 조금 더 빨리로드되는 것 같습니다.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.