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
'programing' 카테고리의 다른 글
python에서 클래스의 모든 멤버 변수를 루핑 (0) | 2023.09.06 |
---|---|
Microsoft SQL Server 2000의 MySQL LIMIT 절 에뮬레이트 (0) | 2023.09.06 |
mysql에서 캐스케이드를 삭제할 때 어떻게 사용합니까? (0) | 2023.09.06 |
오류: SQLSTATE[HY000] [2002] 대상 머신이 적극적으로 거부하여 연결할 수 없음 (0) | 2023.09.06 |
ajax를 통해 FormData 개체와 추가 매개 변수 전송 (0) | 2023.09.06 |