PowerShell ForEach $files in $Files
PowerShell ForEach $file in $Files
我有一个 PowerShell 脚本,它获取文件列表并移动满足特定条件的文件。为什么即使对象为空,foreach
也会循环 运行?
我假设如果 $i 不存在它就不会 运行。但是,如果 $filePath 中没有结果,为什么 forEach 循环 运行 一次?我已经解决了我的问题,但我很好奇并尝试搜索,但找不到答案。
为了让它工作,我只是检查以确保 $filePath 在 forEach 循环之前存在。
例如,如果 ($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 中修复。 PowerShell 的 foreach
循环将允许您迭代标量值,例如:
foreach ($i in 1) {$i}
这很方便,因为很多时候您迭代的集合可以包含 0、1 或 N 个项目,例如:
$files = Get-ChildItem c:\temp\*.txt
foreach ($file in $files) {$file}
在这种情况下,Get-ChildItem
可以 return 0、1 或 N 个文件。 N 个文件很棒,我们可以对其进行迭代。但是,如果它 return 编辑了 1 个文件,然后您必须将该文件粘贴到一个数组中,以便您可以使用 foreach
- 好吧,那有点糟糕。所以 foreach
允许您迭代标量对象。当 Get-ChildItem
returns 0 个对象时出现问题。在这种情况下,不会将空数组分配给 $files。而是分配了 $null。 PowerShell 将 $null 视为标量,因此 foreach
循环将在迭代值为 $null 的位置执行一次。那种糟透了。我和许多其他人很早就告诉了团队,所以在 V3 中,他们更改了 foreach
以在值为 $null 时不迭代标量。
在 V1/V2 中解决此问题的另一种方法是确保空 case 生成一个空数组而不是 $null。您可以使用 @()
数组表达式来做到这一点,例如
$files = @(Get-ChildItem c:\temp\*.txt)
foreach ($file in $files) {$file}
这将适用于 0、1 和 N 个文件。它适用于 0 个文件,因为 @()
将导致一个空数组被分配给 $files。 foreach
在空数组上循环时不会执行它的主体。
我有一个 PowerShell 脚本,它获取文件列表并移动满足特定条件的文件。为什么即使对象为空,foreach
也会循环 运行?
我假设如果 $i 不存在它就不会 运行。但是,如果 $filePath 中没有结果,为什么 forEach 循环 运行 一次?我已经解决了我的问题,但我很好奇并尝试搜索,但找不到答案。
为了让它工作,我只是检查以确保 $filePath 在 forEach 循环之前存在。
例如,如果 ($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 中修复。 PowerShell 的 foreach
循环将允许您迭代标量值,例如:
foreach ($i in 1) {$i}
这很方便,因为很多时候您迭代的集合可以包含 0、1 或 N 个项目,例如:
$files = Get-ChildItem c:\temp\*.txt
foreach ($file in $files) {$file}
在这种情况下,Get-ChildItem
可以 return 0、1 或 N 个文件。 N 个文件很棒,我们可以对其进行迭代。但是,如果它 return 编辑了 1 个文件,然后您必须将该文件粘贴到一个数组中,以便您可以使用 foreach
- 好吧,那有点糟糕。所以 foreach
允许您迭代标量对象。当 Get-ChildItem
returns 0 个对象时出现问题。在这种情况下,不会将空数组分配给 $files。而是分配了 $null。 PowerShell 将 $null 视为标量,因此 foreach
循环将在迭代值为 $null 的位置执行一次。那种糟透了。我和许多其他人很早就告诉了团队,所以在 V3 中,他们更改了 foreach
以在值为 $null 时不迭代标量。
在 V1/V2 中解决此问题的另一种方法是确保空 case 生成一个空数组而不是 $null。您可以使用 @()
数组表达式来做到这一点,例如
$files = @(Get-ChildItem c:\temp\*.txt)
foreach ($file in $files) {$file}
这将适用于 0、1 和 N 个文件。它适用于 0 个文件,因为 @()
将导致一个空数组被分配给 $files。 foreach
在空数组上循环时不会执行它的主体。