$파일의 각 $파일에 대한 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-ChildItem
0, 1 또는 N개의 파일을 반환할 수 있습니다.N개의 파일은 훌륭합니다. 우리는 그것을 반복할 수 있습니다.그러나 만약 그것이 하나의 파일을 반환하고 당신이 사용할 수 있도록 배열된 하나의 파일을 고정시켜야 했습니다.foreach
- 음, 그건 좀 짜증나겠네요. 그래서.foreach
스칼라 객체 위에서 반복할 수 있습니다.문제는 다음과 같이 발생합니다.Get-ChildItem
0개의 개체를 반환합니다.이 경우 $파일에는 빈 배열이 할당되지 않습니다.대신 $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
'programing' 카테고리의 다른 글
Oracle PL/SQL where 절에서 변수를 사용하는 방법 (0) | 2023.11.05 |
---|---|
const로 정의된 객체의 값을 포인터를 통해 변경할 수 있습니까? (0) | 2023.10.31 |
각도 사용법.각 컨트롤러 또는 스코프에서 Json에게 (0) | 2023.10.31 |
AngularJS는 ng-model에서 포맷된 날짜를 얻습니다. (0) | 2023.10.31 |
PHP, MySQL 오류: 열 개수가 1행의 값 개수와 일치하지 않음 (0) | 2023.10.31 |