programing

PowerShell Where-Object 문에 다중 및/또는 포함됨

closeapi 2023. 8. 19. 10:19
반응형

PowerShell Where-Object 문에 다중 및/또는 포함됨

PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object {{ $_.e
xtension-match "xls" -or $_.extension-match "xlk" } -and  { $_.creationtime -ge "06/01/2014"}}

위는 저의 코드 예제입니다.파일 서버에서 이 PowerShell 코드를 원격으로 실행하여 생성 날짜가 2014년 6월 1일 이후인 모든 .xls 및 .xlk 파일을 반환하도록 하려고 합니다.이 코드를 실행하면 원격 위치에 있는 모든 폴더를 뱉어내기 시작합니다.이와 같은 두 가지만 비교하면 다음과 같습니다.

PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object { $_.extension-match "xls" -and  $_.creationtime -ge "06/01/2014"}

해당 날짜 이후에 생성된 xls 파일만 표시됩니다.이게 무슨 일입니까?둥지가 아닌 다른 것을 사용해야 합니까?-and그리고.-or진술서?

비교 내용을 다음으로 정리합니다.{}첫 번째 예제에서는 ScriptBlocks를 만들고 있으므로 PowerShell 인터프리터는 다음과 같이 봅니다.Where-Object { <ScriptBlock> -and <ScriptBlock> }그 이후로-and연산자는 부울 값에서 작동하고 PowerShell은 ScriptBlock을 부울 값으로 캐스팅합니다.PowerShell에서 비어 있지 않은 항목, 0 또는 null은 모두 참입니다.그러면 진술은 다음과 같이 보입니다.Where-Object { $true -and $true }그것은 항상 사실입니다.

사용하는 대신{}괄호 사용().

또한 사용할 항목-eq대신에-matchmatch는 regex를 사용하므로 문자열에서 패턴이 발견되면 true가 됩니다(시도:'xlsx' -match 'xls').

Invoke-Command -computername SERVERNAME { 
    Get-ChildItem -path E:\dfsroots\datastore2\public | 
        Where-Object {($_.extension -eq ".xls" -or $_.extension -eq ".xlk") -and ($_.creationtime -ge "06/01/2014")}
}

더 나은 옵션은 에서 확장을 필터링하는 것입니다.Get-ChildItem지휘권

Invoke-Command -computername SERVERNAME { 
    Get-ChildItem -path E:\dfsroots\datastore2\public\* -Include *.xls, *.xlk | 
        Where-Object {$_.creationtime -ge "06/01/2014"}
}

괄호를 사용해야 할 때는 곡선 괄호를 사용합니다.

curvy bases를 사용하여 정의된 스크립트 블록 내에 문을 보관하는 위치{ }테스트를 분리/랩하려면 괄호를 사용해야 합니다.().

또한 원격 컴퓨터에서 필터링을 시도해 보는 것이 좋습니다.시도:

Invoke-Command -computername SERVERNAME {
    Get-ChildItem -path E:\dfsroots\datastore2\public |
    Where-Object { ($_.extension -eq "xls" -or $_.extension -eq "xlk") -and $_.creationtime -ge "06/01/2014" }
}

여기서 해결책을 찾았습니다.

PowerShell 복사 스크립트에서 여러 문자열을 올바르게 필터링하는 방법

사용해야 합니다.-Include에 대한 깃발.Get-ChildItem

내 예:

$Location = "C:\user\files" 
$result = (Get-ChildItem $Location\* -Include *.png, *.gif, *.jpg)

경로 위치 뒤에 "*"를 넣는 것을 잊지 마십시오.

언급URL : https://stackoverflow.com/questions/24682939/multiple-and-or-in-powershell-where-object-statement

반응형