PowerShell 튜토리얼
PowerShell 시작하기
수색…
비고
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) 이므로이 릴리스 페이지 에서 다운로드하여 설치해야 합니다 .
추가 자료 :
- MSDN 설명서 : https://msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet : https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- PowerShell 갤러리 : https://www.powershellgallery.com/
- MSDN 블로그 : https://blogs.msdn.microsoft.com/powershell/
- Github : https://github.com/powershell
- 커뮤니티 사이트 : http://powershell.com/cs/
버전
번역 | 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 |
설치 또는 설정
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은 기본적으로 서명 된 스크립트 만 실행할 수 있도록 설정됩니다. 다음 명령을 실행하면 서명되지 않은 스크립트를 실행할 수 있습니다 (이 작업을 수행하려면 관리자 권한으로 PowerShell을 실행해야합니다).
Set-ExecutionPolicy RemoteSigned
PowerShell 스크립트를 실행하는 또 다른 방법은 Bypass
를 ExecutionPolicy
로 사용하는 것입니다.
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
별칭 및 유사한 기능
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-Output
은 Echo
또는 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 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의 짧은 별칭입니다.
댓글 달기
#
(해시) 기호를 사용하여 줄을 추가하여 전원 스크립트에 주석을 달려면
# This is a comment in powershell
Get-ChildItem
또한 주석의 처음과 끝에 각각 <#
와 #>
를 사용하여 여러 줄의 주석을 가질 수 있습니다.
<#
This is a
multi-line
comment
#>
Get-ChildItem
.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
객체 생성하기
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- * 명령을 사용하지 말고 객체의 유용성을 유지하십시오.