PowerShellPowerShell 시작하기


비고

Windows PowerShell 은 .NET Framework를 기반으로하는 Microsoft의 자동화 / 구성 관리 프레임 워크 인 Windows 관리 프레임 워크의 셸 및 스크립팅 구성 요소입니다. PowerShell은 Windows 7 / Windows Server 2008 R2 이후 지원되는 모든 버전의 Windows 클라이언트 및 서버 운영 체제에 기본적으로 설치됩니다. Powershell은 WMF ( Windows Management Framework) 의 이후 버전을 다운로드하여 언제든지 업데이트 할 수 있습니다. PowerShell 6의 "Alpha"버전은 크로스 플랫폼 (Windows, Linux 및 OS X) 이므로이 릴리스 페이지 에서 다운로드하여 설치해야 합니다 .

추가 자료 :

버전

번역 Windows에 포함 노트 출시일
1.0 XP / Server 2008 2006-11-01
2.0 7 / Server 2008 R2 2009-11-01
3.0 8 / Server 2012 2012-08-01
4.0 8.1 / Server 2012 R2 2013-11-01
5.0 10 / Server 2016 기술 프리뷰 2015-12-16
5.1 10 주년 기념 에디션 / 서버 2016 2017-01-27

별칭 및 유사한 기능

PowerShell에는 동일한 결과를 얻을 수있는 여러 가지 방법이 있습니다. 이것은 단순하고 익숙한 Hello World 예를 통해 잘 설명 할 수 있습니다.

Write-Host :

Write-Host "Hello World"  
 

Write-Output :

Write-Output 'Hello world'
 

Write-Output & Write-Host 모두 화면에 쓰지만 약간의 차이점이 있음에도 불구하고 주목할 가치가 있습니다. Write-Host 는 stdout (콘솔 화면) 에만 씁니다. 반면 Write-Output 은 stdout 출력 [success] 스트림 모두에 쓰기 때문에 리디렉션을 허용합니다. 리디렉션 (및 일반적으로 스트림)을 사용하면 한 명령의 출력을 변수에 대한 할당을 포함하여 다른 명령의 입력으로 지정할 수 있습니다.

> $message = Write-Output "Hello World"
> $message
"Hello World"
 

이러한 유사한 기능은 별칭이 아니지만 성공 스트림을 "오염"시키지 않으려면 동일한 결과를 산출 할 수 있습니다.

Write-OutputEcho 또는 Write 앨리어싱됩니다.

Echo 'Hello world'
Write 'Hello world'
 

또는 'Hello world'를 입력하면됩니다.

'Hello world'
 

이 모든 것은 예상 콘솔 출력으로 이어집니다.

Hello world
 

PowerShell의 별칭에 대한 또 다른 예는 이전 명령 프롬프트 명령과 BASH 명령을 PowerShell cmdlet에 매핑하는 것입니다. 다음은 모두 현재 디렉토리의 디렉토리 목록을 작성합니다.

C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
 

마지막으로 Set-Alias ​​cmdlet을 사용하여 고유 한 별칭을 만들 수 있습니다. 예를 들어 PowerShell이 ​​명령 프롬프트의 ping 명령과 동등한 Test-NetConnection 을 "ping"으로 설정하는 경우를 예로 들어 보겠습니다.

Set-Alias -Name ping -Value Test-NetConnection
 

이제 Test-NetConnection 대신 ping 을 사용할 수 있습니다! 별칭이 이미 사용 중이면 연결을 덮어 씁니다.

세션이 활성화 될 때까지 별칭이 활성화됩니다. 세션을 닫고 마지막 세션에서 만든 별칭을 실행하면 작동하지 않습니다. 이 문제를 극복하기 위해 작업을 시작하기 전에 Excel에서 모든 별칭을 세션으로 한 번 가져올 수 있습니다.

컴퓨터에 저장된 스크립트가 서명되지 않은 상태로 실행되도록 허용

보안상의 이유로 PowerShell은 기본적으로 서명 된 스크립트 만 실행할 수 있도록 설정됩니다. 다음 명령을 실행하면 서명되지 않은 스크립트를 실행할 수 있습니다 (이 작업을 수행하려면 관리자 권한으로 PowerShell을 실행해야합니다).

Set-ExecutionPolicy RemoteSigned
 

PowerShell 스크립트를 실행하는 또 다른 방법은 BypassExecutionPolicy 로 사용하는 것입니다.

powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
 

또는 다음을 실행하여 기존 PowerShell 콘솔 또는 ISE 세션에서 가져옵니다.

 Set-ExecutionPolicy Bypass Process
 

Powershell 실행 파일을 실행하고 유효한 정책을 -ExecutionPolicy 매개 변수로 전달하면 실행 정책의 임시 해결 방법을 얻을 수도 있습니다. 이 정책은 프로세스 수명 동안 만 적용되므로 레지스트리에 대한 관리 액세스 권한이 필요하지 않습니다.

C:\>powershell -ExecutionPolicy RemoteSigned
 

여러 가지 다른 정책을 사용할 수 있으며 온라인 사이트는 Set-ExecutionPolicy Unrestricted 를 사용하는 것이 좋습니다. 이 정책은 변경 될 때까지 그대로 유지되며 시스템 보안 입장을 낮 춥니 다. 이것은 권하지 않습니다. RemoteSigned 는 로컬에 저장되고 작성된 코드를 허용하고 신뢰할 수있는 루트의 인증서로 원격으로 획득 된 코드에 서명해야하기 때문에 사용하는 것이 좋습니다.

또한 실행 정책이 그룹 정책에 의해 시행 될 수 있으므로 정책이 Unrestricted 시스템 전체로 변경 되더라도 그룹 정책은 다음 시행 간격 (일반적으로 15 분)에 해당 설정을 되돌릴 수 있습니다. Get-ExecutionPolicy -List 사용하여 다양한 범위에서 실행 정책 집합을 볼 수 있습니다.

TechNet 문서 :
Set-ExecutionPolicy
about_Execution_Policies

.Net 라이브러리 메소드 호출하기

정적 닷넷 라이브러리 방법을 사용하여 메소드를 호출 한 후 세 번째 브래킷의 전체 클래스 이름을 캡슐화하여 PowerShell을 호출 할 수 있습니다 ::

#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
 

정적 메서드는 클래스 자체에서 호출 할 수 있지만 정적 메서드를 호출하려면 .Net 클래스 (개체) 인스턴스가 필요합니다.

예를 들어, AddHours 메서드는 System.DateTime 클래스 자체에서 호출 할 수 없습니다. 클래스의 인스턴스가 필요합니다.

C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 

이 경우 먼저 객체를 만듭니다. 예를 들면 다음과 같습니다.

C:\> $Object = [System.DateTime]::Now
 

그런 다음 AddHours 메서드처럼 System.DateTime 클래스에서 직접 호출 할 수없는 메서드조차도 해당 개체의 메서드를 사용할 수 있습니다.

C:\> $Object.AddHours(15)

Monday 12 September 2016 01:51:19
 

댓글 달기

# (해시) 기호를 사용하여 줄을 추가하여 전원 스크립트에 주석을 달려면

# This is a comment in powershell
Get-ChildItem
 

또한 주석의 처음과 끝에 각각 <##> 를 사용하여 여러 줄의 주석을 가질 수 있습니다.

<#
This is a 
multi-line
comment
#>
Get-ChildItem
 

객체 생성하기

New-Object cmdlet은 New-Object 를 만드는 데 사용됩니다.

# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime

# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
 

많은 경우에 데이터를 내보내거나 다른 커맨드 릿으로 전달하기 위해 새로운 객체가 생성됩니다. 이것은 이렇게 할 수 있습니다 :

$newObject = New-Object -TypeName PSObject -Property @{
    ComputerName = "SERVER1"
    Role = "Interface"
    Environment = "Production"
}
 

객체를 만드는 방법에는 여러 가지가 있습니다. 다음 방법은 아마도 PSCustomObject 를 만드는 가장 짧고 빠른 방법 일 것입니다.

$newObject = [PSCustomObject]@{
    ComputerName = 'SERVER1'
    Role         = 'Interface'
    Environment  = 'Production'
}
 

이미 객체가 있지만 하나 또는 두 개의 추가 속성 만 필요하면 Select-Object 를 사용하여 해당 속성을 추가하면됩니다.

Get-ChildItem | Select-Object FullName, Name, 
    @{Name='DateTime'; Expression={Get-Date}}, 
    @{Name='PropertieName'; Expression={'CustomValue'}}
 

모든 개체는 변수에 저장되거나 파이프 라인으로 전달 될 수 있습니다. 또한 이러한 개체를 컬렉션에 추가 한 다음 끝에 결과를 표시 할 수도 있습니다.

개체 컬렉션은 Export-CSV (및 Import-CSV)에서 잘 작동합니다. CSV의 각 행은 객체이며 각 열은 속성입니다.

서식 명령은 표시 할 개체를 텍스트 스트림으로 변환합니다. 모든 데이터 처리의 마지막 단계까지는 Format- * 명령을 사용하지 말고 객체의 유용성을 유지하십시오.

설치 또는 설정

Windows

PowerShell은 Windows 관리 프레임 워크에 포함되어 있습니다. 최신 버전의 Windows에서는 설치 및 설정이 필요하지 않습니다.

PowerShell 업데이트는 Windows 관리 프레임 워크의 최신 버전을 설치하여 수행 할 수 있습니다.

기타 플랫폼

PowerShell 6의 "베타"버전은 다른 플랫폼에 설치할 수 있습니다. 설치 패키지는 여기에서 사용할 수 있습니다 .

예를 들어, Ubuntu 16.04 용 PowerShell 6은 패키지 저장소에 게시되어 쉽게 설치 및 업데이트 할 수 있습니다.

설치하려면 다음을 실행하십시오.

# Import the public repository GPG keys
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

# Register the Microsoft Ubuntu repository
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list

# Update apt-get
sudo apt-get update

# Install PowerShell
sudo apt-get install -y powershell

# Start PowerShell
powershell

수퍼 유저로 Microsoft 리포지토리를 등록한 후에는 sudo apt-get upgrade powershell 을 사용하여 업데이트해야합니다. 그럼 powershell 실행 powershell

파이프 라인 - PowerShell cmdlet의 출력 사용

사람들이 스크립팅에 PowerShell을 사용하기 시작할 때 가장 먼저 묻는 질문 중 하나는 cmdlet의 출력을 조작하여 다른 작업을 수행하는 방법입니다.

파이프 라인 기호 | 는 cmdlet의 끝에 사용되어 내보내는 데이터를 가져와 다음 cmdlet으로 보냅니다. 간단한 예제는 Select-Object를 사용하여 Get-ChildItem에 표시된 파일의 Name 속성 만 표시하는 것입니다.

Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
 

파이프 라인을보다 고급으로 사용하면 cmdlet의 출력을 foreach 루프로 파이프 할 수 있습니다.

Get-ChildItem | ForEach-Object {
    Copy-Item -Path $_.FullName -destination C:\NewDirectory\ 
}

#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
 

위의 예제는 $ _ 자동 변수를 사용합니다. $ _는 파이프 라인의 현재 항목을 포함하는 자동 변수 인 $ PSItem의 짧은 별칭입니다.