programing

PSCustomObject가 아닌 원시 형식(예: String)을 반환하도록 Select-Object를 가져오는 방법은 무엇입니까?

subpage 2023. 9. 6. 22:05
반응형

PSCustomObject가 아닌 원시 형식(예: String)을 반환하도록 Select-Object를 가져오는 방법은 무엇입니까?

다음 코드는 PSCustomObjects 배열을 제공합니다. Strings 배열을 반환하려면 어떻게 해야 합니까?

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)}

(2차적인 질문으로 psis container part의 용도는 무엇입니까?온라인 예시에서 복사했습니다.)

승인 후 편집:두 가지 좋은 답이 있습니다. 두 가지를 모두 표시할 수 있으면 좋겠습니다.원답을 구했습니다.

물건에서 원하는 물건을 골라내기만 하면 됩니다.FullName이 경우에는

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}

편집: 마크에게 설명, "포리는 각자 무엇을 합니까?그것은 무엇을 열거하는 것입니까?"

성마이스터의 설명이 아주 좋지만 도움이 될 수 있으니 여기에 워크스루를 추가하겠습니다.

핵심 개념은 파이프라인입니다.일련의 탁구공들이 좁은 관을 차례로 굴러 내려가는 것을 상상해 보세요.이것들은 파이프라인에 있는 물체들입니다.파이프라인의 각 단계(파이프라인(|) 문자로 구분된 코드 세그먼트)에는 파이프라인으로 들어가는 파이프와 파이프라인에서 나가는 파이프가 있습니다.한 스테이지의 출력은 다음 스테이지의 입력에 연결됩니다.각 단계는 개체가 도착할 때 개체를 가져와 해당 개체에 대해 작업을 수행하고 출력 파이프라인으로 전송하거나 새로운 대체 개체를 전송합니다.

Get-ChildItem $directory -Recurse

을 탐색하여 Get-ChildItem 하여 을 FileSystemInfo각 파일과 디렉토리를 나타내고 파이프라인에 입력하는 개체입니다.

Select-Object FullName

Select-Object각각 가져갑니다FileSystemInfo할때,다를 .FullName속성(이 경우 경로)을 통해 해당 속성을 생성한 새 사용자 지정 개체에 넣고 해당 사용자 지정 개체를 파이프라인에 넣습니다.

Where-Object {!($_.psiscontainer)}

이거 필터에요.각각의 물체를 가져가서 검사하고 어떤 조건에 따라 다시 보내거나 폐기합니다.당신 코드에 버그가 있어요여기에 도착하는 사용자 지정 개체에는psiscontainer 아무 가 없습니다.이 무대는 실제로 아무 효과가 없습니다.Sung Meister의 코드가 더 좋아요.

foreach {$_.FullName}

foreach, 이름이 긴 사람ForEach-Object는 각 서, 의 가 할 서 를 를 서 가 의 할 FullName재산, 거기서 나온 끈.부분이 :기,한이다자다이한:w자기,ste,소비되지 않은 값, 즉 변수에 의해 캡처되지 않거나 어떤 방식으로든 억제되지 않은 값은 출력 파이프라인에 입력됩니다.실험을 위해 해당 스테이지를 다음과 같이 교체해 보십시오.

foreach {'hello'; $_.FullName; 1; 2; 3}

실제로 시험해보고 출력을 조사해보세요.해당 코드 블록에는 4개의 값이 있습니다.소비된 것은 하나도 없습니다.모두 출력에 표시됩니다.이제 시도해 보십시오.

foreach {'hello'; $_.FullName; $x = 1; 2; 3}

값 중 하나가 변수에 의해 캡처되고 있습니다.출력 파이프라인에는 나타나지 않습니다.

사용할 수 있는 파일 이름의 문자열을 가져오려면

$files = Get-ChildItem $directory -Recurse | Where-Object {!($_.psiscontainer)} | Select-Object -ExpandProperty FullName

-ExpandProperty지정한 할 수 있습니다. parameter는 지정한 속성의 유형에 따라 개체를 반환할 수 .

추가 테스트 결과 V1에서는 작동하지 않았지만 V2 CTP3에서는 기능이 고정되었습니다.

질문 #1의 경우

는 "select-object" 부분을 제거했습니다. 이 부분은 중복되며 dangph의 대답과 달리 "foreach" 앞에 "where" 필터를 이동했습니다. 가능한 한 빨리 필터하여 다음 파이프라인에서 처리해야 하는 부분의 일부만 처리하도록 합니다.

$files = Get-ChildItem $directory -Recurse | Where-Object {!$_.PsIsContainer} | foreach {$_.FullName}

그 코드 조각은 기본적으로

  • 모든 파일의 전체 경로를 재귀적으로 가져옵니다(Get-ChildItem $directory -Recurse).
  • 디렉토리를 필터링합니다(Where-Object {!$.PsIsContainer})
  • 전체 파일 이름만 반환합니다(각 {$__).전체 이름})
  • 모든 파일 이름을 $file에 저장

{$_}에 대해 주의하십시오.powershell의 FullName}, 스크립트 블록의 마지막 문({...})이(가) 반환됩니다(이 경우 $_).유형 문자열의 전체 이름

정말 원시 객체를 구해야 한다면 "select-object"를 제거한 후에는 아무것도 할 필요가 없습니다.Select-Object를 사용하지만 원시 개체에 액세스하려면 "PsBase"를 사용합니다. 이 질문은 완전히 다른 질문(주제)입니다. 해당 주제에 대한 자세한 내용은 "PSBASE, PSEXTENDED, PSADAPTED, PSOBJECT의 기능"을 참조하십시오.

질문 #2의 경우

또한 !$_로 필터링합니다.PsIsContainer는 컨테이너 수준 개체를 제외하고 있음을 의미합니다. - 사용자의 경우 파일 시스템 공급자에서 Get-ChildItem을 수행하고 있으므로(Get-PsProvider를 통해 PowerShell 공급자를 볼 수 있음), 컨테이너는 DirectoryInfo(폴더)입니다.

PsIsContainer는 서로 다른 PowerShell 프로바이더에서 다른 것을 의미합니다. 예:)레지스트리 공급자의 경우 PsIsContainer는 Microsoft 유형입니다.Win32.RegistryKey 시도해 보기:

>pushd HKLM:\SOFTWARE
>ls | gm

[UPDATE] 다음 질문에 답합니다.앞다리는 무엇을 합니까? 저것은 무엇을 열거하고 있습니까?"foreach"는 "Foreach-Object"의 별칭입니다. 를 통해 알 수 있습니다.

get-help foreach

-- 아니면 --

get-alias foreach

이제 제 답변에서 "foreach"는 이전 파이프(필터링된 디렉토리가 있는)에서 반환된 FileInfo 유형의 각 개체 인스턴스를 열거하고 있습니다.FileInfo에는 FullName이라는 속성이 있으며 이 속성은 "foreach"가 열거하고 있습니다.
그리고 "foreach" 스크립트 블록 컨텍스트 내의 FileInfo 유형인 "$_"이라는 특수 파이프라인 변수를 통해 파이프라인을 통과한 개체를 참조합니다.

V1의 경우 프로파일에 다음 필터를 추가합니다.

filter Get-PropertyValue([string]$name) { $_.$name }

그러면 다음을 수행할 수 있습니다.

gci . -r | ?{!$_.psiscontainer} | Get-PropertyName fullname

그건 그렇고, PowerShell 커뮤니티 확장을 사용하는 경우 이미 이 기능이 있습니다.

V2에서 Select-Object -Expand를 사용하는 기능과 관련하여 귀여운 트릭이지만 명확하지는 않으며 Select-Object 또는 -Expand가 의도한 바가 아닙니다. -LINQ의 SelectMany와 Select-Object가 여러 속성을 사용자 지정 개체에 투영하는 것처럼 Expand는 평평해지는 것입니다.

언급URL : https://stackoverflow.com/questions/618749/how-to-get-select-object-to-return-a-raw-type-e-g-string-rather-than-pscustom

반응형