programing

$파일의 각 $파일에 대한 PowerShell

megabox 2023. 10. 31. 20:42
반응형

$파일의 각 $파일에 대한 PowerShell

특정 기준에 맞는 파일을 이동하고 파일 목록을 가져오는 PowerShell 스크립트가 있습니다.왜?foreach객체가 비어 있어도 루프 실행?

만약 $i가 존재하지 않는다면 실행되지 않을 것이라고 생각합니다.그러나 $filePath에 결과가 없는 경우 forEach 루프가 한 번 실행되는 이유는 무엇입니까?제 문제를 해결해 보았지만 궁금하고 검색해 보았지만 답을 찾을 수 없었습니다.

이 작업을 수행하려면 $filePath가 forEach 루프 이전에 존재하는지 확인하기만 하면 됩니다.

예를 들어 if($filePath){...

 $filePath = Get-ChildItem -Path $sourceDir | Where-Object {! $_.PSIsContainer -AND ($_.Name -Match "^XXX_XXX*" -OR $_.Name -Match "^YYY_XX*")}

 ForEach($i in $filePath){
     $sfName =  $i.Name
     $sfDir = $i.Directory
     $tFileName = testFile $destDir $sfName
     $sFile = $sourceDir + $sfName
     $tFile = $destDir + $tFileName

     moveFile $sFile $tFile

이 문제는 PowerShell V3 IIRC에서 해결된 고전적인 문제입니다.파워쉘의foreach루프를 사용하면 스칼라 값에 대해 반복할 수 있습니다. 예:

foreach ($i in 1) {$i}

반복하는 컬렉션에 0, 1 또는 N개의 항목이 포함될 수 있으므로 편리합니다.

$files = Get-ChildItem c:\temp\*.txt
foreach ($file in $files) {$file}

이 경우에는.Get-ChildItem0, 1 또는 N개의 파일을 반환할 수 있습니다.N개의 파일은 훌륭합니다. 우리는 그것을 반복할 수 있습니다.그러나 만약 그것이 하나의 파일을 반환하고 당신이 사용할 수 있도록 배열된 하나의 파일을 고정시켜야 했습니다.foreach- 음, 그건 좀 짜증나겠네요. 그래서.foreach스칼라 객체 위에서 반복할 수 있습니다.문제는 다음과 같이 발생합니다.Get-ChildItem0개의 개체를 반환합니다.이 경우 $파일에는 빈 배열이 할당되지 않습니다.대신 $null이 할당됩니다.PowerShell은 $null을 스칼라로 간주하므로foreach루프는 반복되는 값이 $ null인 경우 한 번 실행됩니다.그건 좀 꽝이네요.그리고 저를 비롯한 많은 분들이 일찍부터 팀에 말씀을 드려서 V3에서 바뀌었습니다.foreach값이 $ null이면 스칼라를 반복하지 않습니다.

V1/V2에서 이 문제를 해결하는 또 다른 방법은 빈 경우 $null이 아닌 빈 어레이를 생성하도록 하는 것입니다.당신은 그것을 사용해서 할 수 있습니다.@()배열식(예:

$files = @(Get-ChildItem c:\temp\*.txt)
foreach ($file in $files) {$file}

0, 1, N 파일에 적용됩니다.0개의 파일에 대해 작동합니다. 왜냐하면@()빈 배열이 $파일에 할당됩니다.foreach빈 배열을 루프오버할 때 본문을 실행하지 않습니다.

언급URL : https://stackoverflow.com/questions/29440314/powershell-foreach-file-in-files

반응형