about_Methods
간단한 설명
PowerShell에서 메서드를 사용하여 개체에 대한 작업을 수행하는 방법을 설명합니다.
자세한 설명
PowerShell은 개체를 사용하여 데이터 저장소의 항목 또는 컴퓨터의 상태를 나타냅니다. 예를 들어 FileInfo 개체는 파일 시스템 드라이브의 파일을 나타내고 ProcessInfo 개체는 컴퓨터의 프로세스를 나타냅니다.
개체에는 개체에 대한 데이터를 저장하는 속성과 개체를 변경할 수 있는 메서드가 있습니다.
"메서드"는 개체에 대해 수행할 수 있는 작업을 지정하는 명령 집합입니다. 예를 들어 개체에는 FileInfo
개체가 CopyTo
나타내는 파일을 복사하는 메서드가 FileInfo
포함됩니다.
개체의 메서드를 얻으려면 cmdlet을 Get-Member
사용합니다. 값이 "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
메서드를 사용하여 파일을 C:\Bin
디렉터리에 복사 Final.txt
합니다.
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
참고 항목
PowerShell의 인수 모드와 달리 개체 메서드는 PowerShell이 빌드된 .NET 프레임워크에 대한 통과인 식 모드에서 실행됩니다. 식 모드에서 bareword 인수(따옴표가 지정되지 않은 문자열)는 허용되지 않습니다. 경로를 매개 변수로 사용할 때와 경로를 인수로 사용할 때 이러한 차이를 확인할 수 있습니다. 구문 분석 모드 에 대한 자세한 내용은 about_Parsing
두 번째 메서드 서명은 대상 파일 이름과 대상 파일이 이미 있는 경우 대상 파일을 덮어쓸지 여부를 결정하는 부울 값을 사용합니다.
다음은 두 번째 CopyTo
메서드를 사용하여 파일을 C:\Bin
디렉터리에 복사 Final.txt
하고 기존 파일을 덮어쓰는 예제입니다.
(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
다음 명령은 변수의 세 프로세스 모두에 대해 Kill 메서드를 $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
이 예제는 cmdlet을 사용하여 컬렉션의 Foreach-Object
각 개체에서 메서드를 실행하는 것과 기능적으로 동일합니다.
$p | ForEach-Object {$_.Kill()}
ForEach 및 Where 메서드
PowerShell 4.0부터 메서드 구문을 사용한 컬렉션 필터링이 지원됩니다. 이렇게 하면 컬렉션을 처리할 때 두 가지 새 메서드를 사용할 수 있습니다Where
.ForEach
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}";
}
}
'@
이 예제에서는 Bar 메서드의 덜 구체적인 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 메서드에 전달하기 전에 파일 시스템 네이티브 경로의 경로를 확인해야 합니다.
참고 항목
PowerShell