간단한 설명
PowerShell에서 메서드를 사용하여 개체에 대한 작업을 수행하는 방법을 설명합니다.
긴 설명
PowerShell은 개체를 사용하여 데이터 저장소의 항목 또는 컴퓨터의 상태를 나타냅니다. 예를 들어 FileInfo 개체는 파일 시스템 드라이브의 파일을 나타내고 ProcessInfo 개체는 컴퓨터의 프로세스를 나타냅니다.
개체에는 개체에 대한 데이터를 저장하는 속성과 개체를 변경할 수 있는 메서드가 있습니다.
"메서드"는 개체에 대해 수행할 수 있는 작업을 지정하는 명령 집합입니다. 예를 들어 FileInfo 개체에는 CopyTo 개체가 나타내는 파일을 복사하는 FileInfo 메서드가 포함됩니다.
개체의 메서드를 얻으려면 Get-Member cmdlet을 사용합니다. 값이 "Method"인 MemberType 속성을 사용합니다. 다음 명령은 프로세스 개체의 메서드를 가져옵니다.
Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
BeginErrorReadLine Method System.Void BeginErrorReadLine()
BeginOutputReadLine Method System.Void BeginOutputReadLine()
...
Kill Method System.Void Kill()
Refresh Method System.Void Refresh()
Start Method bool Start()
ToString Method string ToString()
WaitForExit Method bool WaitForExit(int milliseconds), ...
WaitForInputIdle Method bool WaitForInputIdle(int millisecon...
개체의 메서드를 수행하거나 "호출"하려면 점(.), 메서드 이름 및 괄호 집합 "()"을 입력합니다. 메서드에 인수가 있는 경우 인수 값을 괄호 안에 배치합니다. 인수가 없는 경우에도 모든 메서드 호출에 괄호가 필요합니다. 메서드가 여러 인수를 사용하는 경우 쉼표로 구분해야 합니다.
예를 들어 다음 명령은 프로세스의 Kill 메서드를 호출하여 컴퓨터에서 메모장 프로세스를 종료합니다.
$notepad = Get-Process notepad
$notepad.Kill()
이 예제는 위의 문을 결합하여 줄일 수 있습니다.
(Get-Process Notepad).Kill()
Get-Process 명령은 Kill 메서드가 호출되기 전에 실행되도록 괄호로 묶습니다. 그런 다음 반환된 Kill 개체에서 Process 메서드가 호출됩니다.
또 다른 매우 유용한 방법은 문자열의 Replace 메서드입니다.
Replace 메서드는 문자열 내의 텍스트를 바꿉니다. 아래 예제에서는 문자열의 끝 따옴표 바로 앞에 점(.)을 배치할 수 있습니다.
'this is rocket science'.Replace('rocket', 'rock')
this is rock science
이전 예제와 같이, 명령을 사용하거나, 변수에 저장된 개체를 사용하거나, 개체를 생성하는 요소(예: 따옴표로 묶은 문자열)로부터 가져온 개체에서 메서드를 호출할 수 있습니다.
PowerShell 4.0부터 동적 메서드 이름을 사용하여 메서드 호출이 지원됩니다.
메서드에 대한 학습
개체의 메서드에 대한 정의를 찾으려면 개체 형식에 대한 도움말 항목으로 이동하여 해당 메서드 페이지를 찾습니다. 예를 들어 다음 페이지에서는 System.Diagnostics.Process
메서드의 인수를 확인하려면 PowerShell cmdlet의 구문 다이어그램과 같은 메서드 정의를 검토합니다.
메서드 정의에는 PowerShell cmdlet의 매개 변수 집합과 같은 하나 이상의 메서드 서명이 있을 수 있습니다. 서명은 메서드를 호출하는 모든 유효한 명령 형식을 표시합니다.
예를 들어 CopyTo 클래스의 FileInfo 메서드에는 다음 두 메서드 시그니처가 포함됩니다.
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
첫 번째 메서드 서명은 대상 파일 이름(및 경로)을 사용합니다. 다음 예제에서는 첫 번째 CopyTo 메서드를 사용하여 Final.txt 파일을 C:\Bin 디렉터리에 복사합니다.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
비고
PowerShell의 인수 모드와 달리, 개체 메서드는 PowerShell이 구축된 .NET 프레임워크에 대한 패스스루인 표현식 모드에서 실행됩니다. 식 모드에서는 인수(따옴표가 지정되지 않은 문자열)는 허용되지 않습니다. 경로를 매개 변수로 사용할 때와 경로를 인수로 사용할 때 이러한 차이를 확인할 수 있습니다. 구문 분석 모드에 대해 더 많은 정보를 읽으려면 about_Parsing을 참조하십시오.
두 번째 메서드 서명은 대상 파일 이름과 대상 파일이 이미 있는 경우 대상 파일을 덮어쓸지 여부를 결정하는 부울 값을 사용합니다.
다음은 두 번째 CopyTo 메서드를 사용하여 Final.txt 파일을 C:\Bin 디렉터리에 복사하고 기존 파일을 덮어쓰는 예제입니다.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
멤버 접근 권한 나열
PowerShell 3.0부터 멤버 액세스 연산자(.)를 사용하여 목록 컬렉션에 없는 메서드에 액세스하는 경우 PowerShell은 컬렉션의 항목을 자동으로 열거하고 각 항목에 대해 메서드를 호출합니다. 자세한 내용은 about_Member-Access_Enumeration참조하십시오.
예시
다음 예제에서는 개체 컬렉션에서 개별 프로세스 개체의 Kill 메서드를 실행합니다.
첫 번째 명령은 메모장 프로세스의 세 인스턴스를 시작합니다.
Get-Process 메모장 프로세스의 세 인스턴스를 모두 가져오고 $p 변수에 저장합니다.
Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3
다음 명령은 변수의 세 프로세스 모두에 대해 $p 메서드를 실행합니다. 이 명령은 프로세스 컬렉션에 Kill 메서드가 없는 경우에도 작동합니다.
$p.Kill()
Get-Process Notepad
Get-Process 명령은 Kill 메서드가 작동했음을 확인합니다.
Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<< notepad
+ CategoryInfo : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand
이 예제는 Foreach-Object cmdlet을 사용하여 컬렉션의 각 개체에서 메서드를 실행하는 것과 기능적으로 동일합니다.
$p | ForEach-Object {$_.Kill()}
ForEach 및 Where 메서드
PowerShell 4.0부터 메서드 구문을 사용한 컬렉션 필터링이 지원됩니다. 이렇게 하면 컬렉션 ForEachWhere처리할 때 두 가지 새 메서드를 사용할 수 있습니다.
이러한 메서드에 대한 자세한 내용은 문서를 참조하세요 about_arrays
여러 오버로드가 있는 경우 특정 메서드 호출
.NET 메서드를 호출할 때 다음 시나리오를 고려합니다. 메서드가 개체를 사용하지만 더 구체적인 형식을 사용하는 인터페이스를 통해 오버로드가 있는 경우 명시적으로 해당 인터페이스로 캐스팅하지 않는 한 PowerShell은 개체를 수락하는 메서드를 선택합니다.
Add-Type -TypeDefinition @'
// Interface
public interface IFoo {
string Bar(int p);
}
// Type that implements the interface
public class Foo : IFoo {
// Direct member method named 'Bar'
public string Bar(object p) { return $"object: {p}"; }
// *Explicit* implementation of IFoo's 'Bar' method().
string IFoo.Bar(int p) {
return $"int: {p}";
}
}
'@
이 예제에서는 object 메서드의 덜 구체적인 오버로드가 선택되었습니다.
[Foo]::new().Bar(1)
object: 1
이 예제에서는 메서드를 인터페이스 IFoo로 캐스트하여 Bar 메서드의 보다 구체적인 오버로드를 선택합니다.
([IFoo] [Foo]::new()).Bar(1)
int: 1
파일 시스템 경로를 사용하는 .NET 메서드 사용
PowerShell은 프로세스당 여러 Runspace를 지원합니다. 각 Runspace는 고유한 현재 디렉터리를 가지고 있습니다 . 이것은 현재 프로세스의 작업 디렉터리 [System.Environment]::CurrentDirectory와 동일하지 않습니다.
.NET 메서드는 프로세스 작업 디렉터리를 사용합니다. PowerShell cmdlet은 Runspace 위치를 사용합니다. 또한 .NET 메서드는 PowerShell 경로 개체가 아닌 네이티브 파일 시스템 경로에서만 작동합니다. .NET 메서드와 함께 PowerShell 경로를 사용하려면, .NET 메서드에 전달하기 전에 해당 경로를 파일 시스템 전용 경로로 변환해야 합니다.