Get-Counter
로컬 및 원격 컴퓨터에서 성능 카운터 데이터를 가져옵니다.
Syntax
Get-Counter
[[-Counter] <String[]>]
[-SampleInterval <Int32>]
[-MaxSamples <Int64>]
[-Continuous]
[-ComputerName <String[]>]
[<CommonParameters>]
Get-Counter
[-ListSet] <String[]>
[-ComputerName <String[]>]
[<CommonParameters>]
Description
이 cmdlet은 Windows 플랫폼에서만 사용할 수 있습니다.
cmdlet은 Get-Counter
Windows 운영 체제 제품군의 성능 모니터링 계측에서 직접 성능 카운터 데이터를 가져옵니다. Get-Counter
는 로컬 컴퓨터 또는 원격 컴퓨터에서 성능 데이터를 가져옵니다.
매개 변수를 Get-Counter
사용하여 하나 이상의 컴퓨터를 지정하고, 성능 카운터 집합과 해당 집합에 포함된 인스턴스를 나열하고, 샘플 간격을 설정하고, 최대 샘플 수를 지정할 수 있습니다. 매개 변수가 Get-Counter
없으면 시스템 카운터 집합에 대한 성능 카운터 데이터를 가져옵니다.
많은 카운터 집합은 ACL(액세스 제어 목록)으로 보호됩니다. 모든 카운터 집합을 보려면 관리자 권한으로 실행 옵션을 사용하여 PowerShell을 엽니다.
이 cmdlet은 PowerShell 7에서 다시 도입되었습니다.
참고 항목
성능 카운터 이름은 지역화됩니다. 여기에 표시된 예제에서는 성능 개체, 카운터 및 인스턴스의 영어 이름을 사용합니다. 다른 언어를 사용하는 시스템에서는 이름이 달라집니다. 명령을 Get-Counter -ListSet
사용하여 지역화된 이름을 확인합니다.
예제
예제 1: 카운터 집합 목록 가져오기
이 예제에서는 로컬 컴퓨터의 카운터 집합 목록을 가져옵니다.
Get-Counter -ListSet *
CounterSetName : Processor
MachineName : .
CounterSetType : MultiInstance
Description : The Processor performance object consists of counters that measure aspects ...
computer that performs arithmetic and logical computations, initiates ...
computer can have multiple processors. The processor object represents ...
Paths : {\Processor(*)\% Processor Time, \Processor(*)\% User Time, ...
PathsWithInstances : {\Processor(0)\% Processor Time, \Processor(1)\% Processor Time, ...
Counter : {\Processor(*)\% Processor Time, \Processor(*)\% User Time, ...
Get-Counter
는 별표(*
)와 함께 ListSet 매개 변수를 사용하여 카운터 집합 목록을 가져옵니다.
MachineName 열의 점(.
)은 로컬 컴퓨터를 나타냅니다.
예제 2: SampleInterval 및 MaxSamples 지정
이 예제에서는 로컬 컴퓨터의 모든 프로세서에 대한 카운터 데이터를 가져옵니다. 데이터는 세 개의 샘플이 있을 때까지 2초 간격으로 수집됩니다.
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 2 -MaxSamples 3
Timestamp CounterSamples
--------- --------------
6/18/2019 14:39:56 \\Computer01\processor(_total)\% processor time :
20.7144271584086
6/18/2019 14:39:58 \\Computer01\processor(_total)\% processor time :
10.4391790575511
6/18/2019 14:40:01 \\Computer01\processor(_total)\% processor time :
37.5968799396998
Get-Counter
는 Counter 매개 변수를 사용하여 카운터 경로를 \Processor(_Total)\% Processor Time
지정합니다. SampleInterval 매개 변수는 카운터를 검사 2초 간격을 설정합니다. MaxSamples는 카운터를 검사 최대 횟수인 3개를 결정합니다.
예제 3: 카운터의 연속 샘플 가져오기
이 예제에서는 1초마다 카운터에 대한 연속 샘플을 가져옵니다. 명령을 중지하려면 CTRL+C를 누릅니다. 샘플 간에 더 긴 간격을 지정하려면 SampleInterval 매개 변수를 사용합니다.
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -Continuous
Timestamp CounterSamples
--------- --------------
6/19/2019 15:35:03 \\Computer01\processor(_total)\% processor time :
43.8522842937022
6/19/2019 15:35:04 \\Computer01\processor(_total)\% processor time :
29.7896844697383
6/19/2019 15:35:05 \\Computer01\processor(_total)\% processor time :
29.4962645638135
6/19/2019 15:35:06 \\Computer01\processor(_total)\% processor time :
25.5901500127408
Get-Counter
는 Counter 매개 변수를 사용하여 카운터를 지정합니다 \Processor\% Processor Time
.
Continuous 매개 변수는 Ctrl+C를 사용하여 명령이 중지될 때까지 1초마다 샘플을 가져오기 위해 지정합니다.
예제 4: 카운터 집합의 사전순 목록
이 예제에서는 파이프라인을 사용하여 카운터 목록 집합을 가져와서 사전순으로 목록을 정렬합니다.
Get-Counter -ListSet * |
Sort-Object -Property CounterSetName |
Format-Table CounterSetName, CounterSetType -AutoSize
CounterSetName CounterSetType
-------------- --------------
.NET CLR Data SingleInstance
.NET Data Provider for SqlServer SingleInstance
AppV Client Streamed Data Percentage SingleInstance
Authorization Manager Applications SingleInstance
BitLocker MultiInstance
Bluetooth Device SingleInstance
Cache SingleInstance
Client Side Caching SingleInstance
Get-Counter
는 별표(*
)와 함께 ListSet 매개 변수를 사용하여 카운터 집합의 전체 목록을 가져옵니다. CounterSet 개체는 파이프라인 아래로 전송됩니다. Sort-Object
는 Property 매개 변수를 사용하여 개체가 CounterSetName별로 정렬되도록 지정합니다. 개체는 파이프라인 Format-Table
아래로 전송됩니다. AutoSize 매개 변수는 잘림을 최소화하기 위해 열 너비를 조정합니다.
MachineName 열의 점(.
)은 로컬 컴퓨터를 나타냅니다.
예제 5: 백그라운드 작업을 실행하여 카운터 데이터 가져오기
이 예제에서는 Start-Job
로컬 컴퓨터에서 Get-Counter
백그라운드 작업으로 명령을 실행합니다.
작업에서 성능 카운터 출력을 보려면 cmdlet을 Receive-Job
사용합니다.
Start-Job -ScriptBlock {Get-Counter -Counter "\LogicalDisk(_Total)\% Free Space" -MaxSamples 1000}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Counter -Counter
Start-Job
는 ScriptBlock 매개 변수를 사용하여 명령을 실행합니다 Get-Counter
. Get-Counter
는 Counter 매개 변수를 사용하여 카운터 경로를 \LogicalDisk(_Total)\% Free Space
지정합니다. MaxSamples 매개 변수는 카운터 샘플을 1000개 가져오기 위해 지정합니다.
예제 6: 여러 컴퓨터에서 카운터 데이터 가져오기
이 예제에서는 변수를 사용하여 두 컴퓨터에서 성능 카운터 데이터를 가져옵니다.
$DiskReads = "\LogicalDisk(C:)\Disk Reads/sec"
$DiskReads | Get-Counter -ComputerName Server01, Server02 -MaxSamples 10
Timestamp CounterSamples
--------- --------------
6/21/2019 10:51:04 \\Server01\logicaldisk(c:)\disk reads/sec :
0
\\Server02\logicaldisk(c:)\disk reads/sec :
0.983050344269146
변수는 $DiskReads
카운터 경로를 저장합니다 \LogicalDisk(C:)\Disk Reads/sec
. 변수가 $DiskReads
파이프라인 아래로 전송됩니다 Get-Counter
. Counter 는 첫 번째 위치 매개 변수이며 에 저장된 $DiskReads
경로를 허용합니다. ComputerName 은 두 컴퓨터를 지정하고 MaxSamples는 각 컴퓨터에서 10개의 샘플을 가져오기 위해 지정합니다.
예제 7: 여러 임의 컴퓨터에서 카운터의 인스턴스 값 가져오기
이 예제에서는 엔터프라이즈의 임의 원격 컴퓨터 50대에 대한 성능 카운터 값을 가져옵니다. ComputerName 매개 변수는 변수에 저장된 임의의 컴퓨터 이름을 사용합니다. 변수의 컴퓨터 이름을 업데이트하려면 변수를 다시 만듭니다.
ComputerName 매개 변수의 서버 이름에 대한 대안은 텍스트 파일을 사용하는 것입니다. 예시:
-ComputerName (Get-Random (Get-Content -Path C:\Servers.txt) -Count 50)
카운터 경로에는 각 원격 컴퓨터의 프로세서에 대한 데이터를 가져오는 별표(*
)가 인스턴스 이름에 포함됩니다.
$Servers = Get-Random (Get-Content -Path C:\Servers.txt) -Count 50
$Counter = "\Processor(*)\% Processor Time"
Get-Counter -Counter $Counter -ComputerName $Servers
Timestamp CounterSamples
--------- --------------
6/20/2019 12:20:35 \\Server01\processor(0)\% processor time :
6.52610319637854
\\Server01\processor(1)\% processor time :
3.41030663625782
\\Server01\processor(2)\% processor time :
9.64189975649925
\\Server01\processor(3)\% processor time :
1.85240835619747
\\Server01\processor(_total)\% processor time :
5.35768447160776
cmdlet은 Get-Random
파일에서 50개 임의 Servers.txt
컴퓨터 이름을 선택하는 데 사용합니다Get-Content
. 원격 컴퓨터 이름은 변수에 $Servers
저장됩니다. \Processor(*)\% Processor Time
카운터의 경로는 변수에 $Counter
저장됩니다. Get-Counter
는 Counter 매개 변수를 사용하여 변수의 카운터를 $Counter
지정합니다. ComputerName 매개 변수는 변수의 컴퓨터 이름을 $Servers
지정합니다.
예제 8: Path 속성을 사용하여 서식이 지정된 경로 이름 가져오기
이 예제에서는 카운터 집합의 Path 속성을 사용하여 성능 카운터에 대한 형식이 지정된 경로 이름을 찾습니다.
파이프라인은 cmdlet과 함께 Where-Object
경로 이름의 하위 집합을 찾는 데 사용됩니다. 카운터 집합 카운터 경로의 전체 목록을 찾으려면 파이프라인(|
) 및 Where-Object
명령을 제거합니다.
파이프라인 $_
의 현재 개체에 대한 자동 변수입니다.
자세한 내용은 about_Automatic_Variables를 참조하세요.
(Get-Counter -ListSet Memory).Paths | Where-Object { $_ -like "*Cache*" }
\Memory\Cache Faults/sec
\Memory\Cache Bytes
\Memory\Cache Bytes Peak
\Memory\System Cache Resident Bytes
\Memory\Standby Cache Reserve Bytes
\Memory\Standby Cache Normal Priority Bytes
\Memory\Standby Cache Core Bytes
\Memory\Long-Term Average Standby Cache Lifetime (s)
Get-Counter
는 ListSet 매개 변수를 사용하여 메모리 카운터 집합을 지정합니다. Paths 속성이 각 경로를 문자열로 반환할 수 있도록 명령은 괄호로 묶입니다. 개체는 파이프라인 Where-Object
아래로 전송됩니다. Where-Object
에서는 변수 $_
를 사용하여 각 개체를 처리하고 연산자를 -like
사용하여 문자열 *Cache*
에 대한 일치 항목을 찾습니다. 별표(*
)는 모든 문자에 대해 야생카드입니다.
예제 9: PathsWithInstances 속성을 사용하여 서식이 지정된 경로 이름을 가져옵니다.
이 예제에서는 PhysicalDisk 성능 카운터에 대한 인스턴스를 포함하는 형식이 지정된 경로 이름을 가져옵니다.
(Get-Counter -ListSet PhysicalDisk).PathsWithInstances
\PhysicalDisk(0 C:)\Current Disk Queue Length
\PhysicalDisk(_Total)\Current Disk Queue Length
\PhysicalDisk(0 C:)\% Disk Time
\PhysicalDisk(_Total)\% Disk Time
\PhysicalDisk(0 C:)\Avg. Disk Queue Length
\PhysicalDisk(_Total)\Avg. Disk Queue Length
\PhysicalDisk(0 C:)\% Disk Read Time
\PhysicalDisk(_Total)\% Disk Read Time
Get-Counter
는 ListSet 매개 변수를 사용하여 PhysicalDisk 카운터 집합을 지정합니다. PathsWithInstances 속성이 각 경로 인스턴스를 문자열로 반환할 수 있도록 명령은 괄호로 묶습니다.
예제 10: 카운터 집합의 각 카운터에 대한 단일 값 가져오기
이 예제에서는 로컬 컴퓨터의 메모리 카운터 집합에 있는 각 성능 카운터에 대해 단일 값이 반환됩니다.
$MemCounters = (Get-Counter -ListSet Memory).Paths
Get-Counter -Counter $MemCounters
Timestamp CounterSamples
--------- --------------
6/19/2019 12:05:00 \\Computer01\memory\page faults/sec :
868.772077545597
\\Computer01\memory\available bytes :
9031176192
\\Computer01\memory\committed bytes :
8242982912
\\Computer01\memory\commit limit :
19603333120
Get-Counter
는 ListSet 매개 변수를 사용하여 메모리 카운터 집합을 지정합니다. Paths 속성이 각 경로를 문자열로 반환할 수 있도록 명령은 괄호로 묶입니다. 경로는 변수에 $MemCounters
저장됩니다. Get-Counter
는 Counter 매개 변수를 사용하여 변수의 카운터 경로를 지정합니다$MemCounters
.
예제 11: 개체의 속성 값 표시
PerformanceCounterSample 개체의 속성 값은 각 데이터 샘플을 나타냅니다. 이 예제에서는 CounterSamples 개체의 속성을 사용하여 데이터를 검사, 선택, 정렬 및 그룹화합니다.
$Counter = "\\Server01\Process(Idle)\% Processor Time"
$Data = Get-Counter $Counter
$Data.CounterSamples | Format-List -Property *
Path : \\Server01\process(idle)\% processor time
InstanceName : idle
CookedValue : 198.467899571389
RawValue : 14329160321003
SecondValue : 128606459528326201
MultipleCount : 1
CounterType : Timer100Ns
Timestamp : 6/19/2019 12:20:49
Timestamp100NSec : 128606207528320000
Status : 0
DefaultScale : 0
TimeBase : 10000000
카운터 경로는 변수에 $Counter
저장됩니다. Get-Counter
는 카운터 값의 샘플 하나를 가져오고 결과를 변수에 $Data
저장합니다. 변수는 $Data
CounterSamples 속성을 사용하여 개체의 속성을 가져옵니다. 개체가 파이프라인 아래로 전송됩니다 Format-List
. Property 매개 변수는 별표(*
) wild카드를 사용하여 모든 속성을 선택합니다.
예제 12: 성능 카운터 배열 값
이 예제에서 변수는 각 성능 카운터를 저장합니다. CounterSamples 속성은 특정 카운터 값을 표시할 수 있는 배열입니다.
각 카운터 샘플을 $Counter.CounterSamples
표시하려면 .
$Counter = Get-Counter -Counter "\Processor(*)\% Processor Time"
$Counter.CounterSamples[0]
Path InstanceName CookedValue
---- ------------ -----------
\\Computer01\processor(0)\% processor time 0 1.33997091699662
Get-Counter
는 Counter 매개 변수를 사용하여 카운터 \Processor(*)\% Processor Time
를 지정합니다. 값은 변수에 $Counter
저장됩니다.
$Counter.CounterSamples[0]
는 첫 번째 카운터 값의 배열 값을 표시합니다.
예제 13: 성능 카운터 값 비교
이 예제에서는 로컬 컴퓨터의 각 프로세서에서 사용하는 프로세서 시간을 찾습니다. CounterSamples 속성은 카운터 데이터를 지정된 값과 비교하는 데 사용됩니다.
각 카운터 샘플을 $Counter.CounterSamples
표시하려면 .
$Counter = Get-Counter -Counter "\Processor(*)\% Processor Time"
$Counter.CounterSamples | Where-Object { $_.CookedValue -lt "20" }
Path InstanceName CookedValue
---- ------------ -----------
\\Computer01\processor(0)\% processor time 0 12.6398025240208
\\Computer01\processor(1)\% processor time 1 15.7598095767344
Get-Counter
는 Counter 매개 변수를 사용하여 카운터 \Processor(*)\% Processor Time
를 지정합니다. 값은 변수에 $Counter
저장됩니다. 저장된 $Counter.CounterSamples
개체는 파이프라인 아래로 전송됩니다. Where-Object
는 스크립트 블록을 사용하여 각 개체 값을 지정된 값 20
과 비교합니다. 파이프라인 $_.CookedValue
의 현재 개체에 대한 변수입니다. 20보다 작은 CookedValue가 있는 카운터가 표시됩니다.
예제 14: 성능 카운터 데이터 정렬
이 예제에서는 성능 카운터 데이터를 정렬하는 방법을 보여 줍니다. 이 예제에서는 샘플 중에 가장 많은 프로세서 시간을 사용하는 컴퓨터의 프로세스를 찾습니다.
$Procs = Get-Counter -Counter "\Process(*)\% Processor Time"
$Procs.CounterSamples | Sort-Object -Property CookedValue -Descending |
Format-Table -Property Path, InstanceName, CookedValue -AutoSize
Path InstanceName CookedValue
---- ------------ -----------
\\Computer01\process(_total)\% processor time _total 395.464129650573
\\Computer01\process(idle)\% processor time idle 389.356575524695
\\Computer01\process(mssense)\% processor time mssense 3.05377706293879
\\Computer01\process(csrss#1)\% processor time csrss 1.52688853146939
\\Computer01\process(microsoftedgecp#10)\% processor time microsoftedgecp 1.52688853146939
\\Computer01\process(runtimebroker#5)\% processor time runtimebroker 0
\\Computer01\process(settingsynchost)\% processor time settingsynchost 0
\\Computer01\process(microsoftedgecp#16)\% processor time microsoftedgecp 0
Get-Counter
는 Counter 매개 변수를 사용하여 로컬 컴퓨터의 \Process(*)\% Processor Time
모든 프로세스에 대한 카운터를 지정합니다. 결과는 $Procs
변수에 저장됩니다. CounterSamples 속성이 있는 변수는 $Procs
PerformanceCounterSample 개체를 파이프라인 아래로 보냅니다. Sort-Object
는 Property 매개 변수를 사용하여 내림차순으로 CookedValue별로 개체를 정렬합니다. Format-Table
에서는 Property 매개 변수를 사용하여 출력에 대한 열을 선택합니다. AutoSize 매개 변수는 잘림을 최소화하기 위해 열 너비를 조정합니다.
매개 변수
-ComputerName
컴퓨터 이름 하나 또는 원격 컴퓨터 이름의 쉼표로 구분된 배열을 지정합니다. NetBIOS 이름, IP 주소 또는 컴퓨터의 정규화된 do기본 이름을 사용합니다.
로컬 컴퓨터에서 성능 카운터 데이터를 얻으려면 ComputerName 매개 변수를 제외합니다.
MachineName 열을 포함하는 ListSet과 같은 출력의 경우 점(.
)은 로컬 컴퓨터를 나타냅니다.
Get-Counter
는 PowerShell 원격을 사용하지 않습니다. 컴퓨터가 원격 명령을 실행하도록 구성되지 않은 경우에도 ComputerName 매개 변수를 사용할 수 있습니다.
Type: | String[] |
Aliases: | Cn |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Continuous
연속이 지정되면 Get-Counter
Ctrl+C를 누를 때까지 샘플을 가져옵니다. 샘플은 지정된 각 성능 카운터에 대해 1초마다 가져옵니다. SampleInterval 매개 변수를 사용하여 연속 샘플 간의 간격을 늘입니다.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Counter
하나 이상의 카운터 경로에 대한 경로를 지정합니다. 경로는 쉼표로 구분된 배열, 변수 또는 텍스트 파일의 값으로 입력됩니다. 파이프라인 Get-Counter
아래로 카운터 경로 문자열을 보낼 수 있습니다.
카운터 경로는 다음 구문을 사용합니다.
\\ComputerName\CounterSet(Instance)\CounterName
\CounterSet(Instance)\CounterName
예시:
\\Server01\Processor(*)\% User Time
\Processor(*)\% User Time
\\ComputerName
성능 카운터 경로에서 선택 사항입니다. 카운터 경로에 컴퓨터 이름이 Get-Counter
포함되어 있지 않으면 로컬 컴퓨터를 사용합니다.
인스턴스의 별표(*
)는 카운터의 모든 인스턴스를 가져오는 야생카드 문자입니다.
Type: | String[] |
Position: | 0 |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | True |
-ListSet
컴퓨터의 성능 카운터 집합을 나열합니다. 별표(*
)를 사용하여 모든 카운터 집합을 지정합니다. 하나의 이름 또는 카운터 집합 이름의 쉼표로 구분된 문자열을 입력합니다. 파이프라인 아래로 카운터 집합 이름을 보낼 수 있습니다.
카운터 집합 형식의 카운터 경로를 얻으려면 ListSet 매개 변수를 사용합니다. 각 카운터 집합의 Paths 및 PathsWithInstances 속성에는 문자열로 서식이 지정된 개별 카운터 경로가 포함됩니다.
카운터 경로 문자열을 변수에 저장하거나 파이프라인을 사용하여 문자열을 다른 Get-Counter
명령으로 보낼 수 있습니다.
예를 들어 각 프로세서 카운터 경로를 다음으로 보냅니다.Get-Counter
Get-Counter -ListSet Processor | Get-Counter
참고 항목
PowerShell 7 Get-Counter
에서는 카운터 집합의 Description 속성을 검색할 수 없습니다. 설명이 .로 설정됩니다$null
.
Type: | String[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | True |
-MaxSamples
지정된 각 성능 카운터에서 가져올 샘플 수를 지정합니다. 샘플의 상수 스트림을 얻으려면 Continuous 매개 변수를 사용합니다.
MaxSamples 매개 변수를 지정 Get-Counter
하지 않으면 지정된 각 카운터에 대해 하나의 샘플만 가져옵니다.
큰 데이터 집합을 수집하려면 PowerShell 백그라운드 작업으로 실행 Get-Counter
합니다. 자세한 내용은 about_Jobs 참조하세요.
Type: | Int64 |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SampleInterval
지정된 각 성능 카운터에 대한 샘플 사이의 시간(초)을 지정합니다. SampleInterval 매개 변수를 지정 Get-Counter
하지 않으면 1초 간격을 사용합니다.
Type: | Int32 |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
입력
String[]
Get-Counter
는 카운터 경로 및 카운터 집합 이름에 대한 파이프라인 입력을 허용합니다.
출력
ListSet 매개 변수를 사용하여 이 cmdlet은 CounterSet 개체를 반환합니다.
기본적으로 Counter 매개 변수를 사용하여 이 cmdlet은 PerformanceCounterSampleSet 개체를 반환합니다.
참고
매개 변수가 지정되지 Get-Counter
않은 경우 지정된 각 성능 카운터에 대해 하나의 샘플을 가져옵니다. MaxSamples 및 연속 매개 변수를 사용하여 더 많은 샘플을 가져옵니다.
Get-Counter
은 샘플 간에 1초 간격을 사용합니다. SampleInterval 매개 변수를 사용하여 간격을 늘입니다.
MaxSamples 및 SampleInterval 값은 명령의 각 컴퓨터에 있는 모든 카운터에 적용됩니다. 다른 카운터에 대해 다른 값을 설정하려면 별도의 Get-Counter
명령을 입력합니다.
PowerShell 7에서 ListSet 매개 변수 Get-Counter
를 사용하는 경우 카운터 집합의 Description 속성을 검색할 수 없습니다. 설명이 .로 설정됩니다$null
.
관련 링크
PowerShell