을 얻는 방법을 선택-객체를 반환하는 원료 유형(예를 들어,문자열)보다는 오히려 PSCustomObject?
-
03-07-2019 - |
문제
다음 코드의 배열 PSCustomObjects,내가 그것을 얻을 수있는 방법을 배열을 반환의 문자열?
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)}
(보조 질문이 무엇인 psiscontainer 부분까?내가 복사하는 것에서는 온라인 예)
Post-동정 두 가지 훌륭한 답변,수 마크습니다.수여했다 원래의 대답이다.
해결책
물체에서 원하는 속성을 선택하면됩니다. FullName
이 경우.
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}
편집하다: 마크에 대한 설명은 누가 "Foreach는 무엇을합니까? 무엇을 열거 하는가?"
성 Meister의 설명은 매우 좋지만 도움이 될 수 있기 때문에 여기에 연습을 추가하겠습니다.
핵심 개념은 파이프 라인입니다. 좁은 튜브를 다른 튜브를 굴리는 일련의 핑판 공을 상상해보십시오. 이것들은 파이프 라인의 개체입니다. 파이프 라인의 각 단계 (파이프) 문자로 분리 된 코드 세그먼트는 파이프가 들어가서 파이프가 나오는 경우가 있습니다. 한 단계의 출력은 다음 단계의 입력에 연결됩니다. 각 단계는 객체가 도착할 때, 그들에게 일을하고, 출력 파이프 라인으로 다시 보내거나 새로운 교체 객체를 보냅니다.
Get-ChildItem $directory -Recurse
Get-ChildItem은 파일 시스템을 통해 걸어서 FileSystemInfo 객체를 생성하여 각 파일과 디렉토리를 나타내는 객체를 파이프 라인에 넣습니다.
Select-Object FullName
Select-Object 각 FileSystemInfo 객체가 도착하면서 각 FileSystemInfo 객체를 가져 가고,이 경우 경로에서 FullName 속성을 잡고 해당 속성을 생성 한 새로운 사용자 지정 개체에 넣고 해당 사용자 정의 객체를 파이프 라인에 넣습니다.
Where-Object {!($_.psiscontainer)}
이것은 필터입니다. 각 객체를 취하고 검사하고 일부 조건에 따라 다시 보내거나 버립니다. 그건 그렇고 여기의 코드에는 버그가 있습니다. 여기에 도착한 사용자 정의 객체에는 Psiscontainer 속성이 없습니다. 이 단계는 실제로 아무것도하지 않습니다. 성 Meister의 코드가 더 좋습니다.
foreach {$_.FullName}
긴 이름이 Foreach-Object 인 Foreach는 각 객체가 도착했을 때 각 객체를 잡고 여기에서 fullName 속성, 문자열을 가져옵니다. 이제 미묘한 부분이 있습니다. 소비되지 않은 모든 값, 즉 변수로 캡처되지 않거나 어떤 방식 으로든 억제되지 않은 모든 값은 출력 파이프 라인에 넣습니다. 실험으로 해당 단계를 다음과 같이 대체하십시오.
foreach {'hello'; $_.FullName; 1; 2; 3}
실제로 시도해보고 출력을 검사하십시오. 해당 코드 블록에는 네 가지 값이 있습니다. 그들 중 누구도 소비되지 않습니다. 그것들은 모두 출력에 나타납니다. 이제 이것을 시도하십시오 :
foreach {'hello'; $_.FullName; $ x = 1; 2; 3}
값 중 하나가 변수로 캡처되고 있습니다. 출력 파이프 라인에는 나타나지 않습니다.
다른 팁
파일 이름의 문자열을 얻으려면 사용할 수 있습니다.
$files = Get-ChildItem $directory -Recurse | Where-Object {!($_.psiscontainer)} | Select-Object -ExpandProperty FullName
그만큼 -ExpandProperty
매개 변수를 사용하면 지정된 속성의 유형에 따라 객체를 되 찾을 수 있습니다.
추가 테스트에 따르면 V1에서는 작동하지 않았지만 기능은 V2 CTP3에 따라 고정되어 있습니다.
에 대한 질문에#1
나는 제거"를 선택하여"개체 부-그것은 중복과 이동"여기서"필터링하기 전에"foreach 과는 달리" dangph 의 응답 필터 가능한 한 빨리 그래서 당신이 다루는 일부만의 어떤에 당신을 처리해야에서는 다음 파이프 라인입니다.
$files = Get-ChildItem $directory -Recurse | Where-Object {!$_.PsIsContainer} | foreach {$_.FullName}
는 코드 조각 기본적으로 읽어
- 모든 파일의 전체 경로에 모든 파일을 재귀적으로(얻-ChildItem$directory Recurse)
- 어링 디렉터리(Where-체{!$_.PsIsContainer})
- 반품 전체 파일 이름만(foreach{$_.FullName})
- 을 저장하는 모든 파일 이름으로$파일
Note foreach{$_.FullName}, 에서,powershell,마지막 문에서 스크립트 블록({...})반환,이 경우$_.FullName 의 형식 문자열
당신이 정말로 당신을 얻을 필요가 원체,당신이 할 필요가 없 아무것도 얻은 후에 제거"를 선택-체".를 사용하는 경우 선택합체나 액세스하려면 원시체를 사용"PsBase"는 완전히 다른 질문(주제)-"를 참조하십시오What's up PSBASE,PSEXTENDED,PSADAPTED 및 PSOBJECT?"에 대한 자세한 정보는 제목
에 대한 질문에#2
또한 필터링하여 !$_.PsIsContainer 즉,당신은 제외 콘테이너 수준체에서 당신의 경우,당신 Get-ChildItem 에 파일 시스템 공급자는(당신이 볼 수 있 PowerShell 공급자를 통해 얻-PsProvider),도록 컨테이너 또는 파일 이름이 시(폴더)
PsIsContainer 다른 것을 의미합에서 다른 PowerShell 공급자;예를 들어)한 레지스트리 공급자 PsIsContainer 유형 Microsoft.Win32.때 이것을 보십시오:
>pushd HKLM:\SOFTWARE
>ls | gm
[UPDATE] 다음과 같은 질문: 무엇 foreach 니까?무엇을 열거나요? 을 명확히,"foreach"은 별칭을"Foreach-Object" 을 찾을 수 있습을 통해,
get-help foreach
-또는-
get-alias foreach
지금 나의 응답,"foreach"열거하는 각 개체를 인스턴스의 유형 FileInfo 에서 돌아가 이전 파이프(는 필터링된 디렉토리). FileInfo 라는 속성 FullName 는"foreach"은 열거한다.
과를 참조할 객체를 통해 전달되는 파이프라인을 통해 파이프라인 특별한 변수라고"$_"형식 FileInfo 스크립트 블록 내에서의 컨텍스트"foreach".
V1의 경우 프로필에 다음 필터를 추가하십시오.
filter Get-PropertyValue([string]$name) { $_.$name }
그런 다음 다음을 수행 할 수 있습니다.
gci . -r | ?{!$_.psiscontainer} | Get-PropertyName fullname
BTW, 사용중인 경우 PowerShell 커뮤니티 확장 당신은 이미 이것을 가지고 있습니다.
V2에서 Select -Object -expand를 사용하는 능력과 관련하여, 귀여운 트릭이지만 명백하지는 않으며 실제로 Select -Object Nor -expand의 의미는 아닙니다. -Expand는 LINQ의 SelectMany와 같은 평평한 것에 관한 것이며 Select-Object는 여러 속성을 사용자 정의 객체에 투영하는 것입니다.