을 얻는 방법을 선택-객체를 반환하는 원료 유형(예를 들어,문자열)보다는 오히려 PSCustomObject?

StackOverflow https://stackoverflow.com/questions/618749

  •  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는 여러 속성을 사용자 정의 객체에 투영하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top