我可以在接下来的另一个 foreach 循环中使用在 foreach 循环中生成的变量吗?

问题描述 投票:0回答:2

该脚本使用 gci 从许多文件夹和子文件夹中获取最新文件。每个子子文件夹中的最新文件都位于变量 $latestfile 中。下一步我想通过 foreach 循环获取每个最新文件的父文件夹。在另一个 foreach 循环中使用 $latestfile 变量似乎有问题。


此代码有效:

#Copying with variable, get the latest file, descending take  first, timestamp
$latestfile = Get-ChildItem -Path 'C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ' -Directory | ForEach-Object {
    (Get-ChildItem -Path $_.FullName -Filter '*.xml' -File -Recurse |
     Sort-Object LastWriteTime | Select-Object -Last 1).FullName
}
echo $latestfile

输出:

C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.931\202307\16\0238\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.932\202307\16\0251\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.940\202312\17\1204\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.941\202312\17\1125\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.942\202312\23\1107\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.943\202312\23\1106\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.944\202312\19\1116\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.945\202311\25\1238\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.946\201812\23\1536\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.947\202312\17\1101\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.948\202312\17\1108\fiscal.xml
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.950\201912\22\1015\fiscal.xml

接下来我想通过 foreach 循环获取每个父文件夹:


#Get Parent folder, create variable $parent
$parent = ForEach-Object {(Get-Item $latestfile).Directory.Parent
}
echo $parent

给我一条错误消息:

Get-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
In C:\Users\User\Documents\ps\foreach_gci_latestfile.ps1:11 Zeichen:37
+ $parent = ForEach-Object {(Get-Item $latestfile).Directory.Parent
+                                     ~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Get-Item], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetItemCommand

感谢您的帮助

powershell variables foreach
2个回答
0
投票

是的,您可以在 PowerShell 中的另一个 foreach 循环中使用在一个 foreach 循环中生成的变量。但是,您需要记住一些注意事项:

在循环外定义数组或集合

$项目 = @(1, 2, 3, 4, 5)

第一个 foreach 循环

foreach($items 中的$item){ 写入输出“处理项目:$item”

# Use the $item variable in the first loop
# Second foreach loop

foreach($items 中的$anotherItem){ 写入输出“处理另一个项目:基于 $item 的 $anotherItem”

}

}


0
投票

正如 mclayton 在评论中所述,上一步 (

$latestfile
) 生成的数组就是 您通过管道输入
ForEach-Object
然后您可以通过
$_
引用每个管道项:

$latestfile = Get-ChildItem -Path 'path\to\Journ' -Directory | ForEach-Object {
    Get-ChildItem -Path $_.FullName -Filter '*.xml' -File -Recurse |
        Sort-Object LastWriteTime |
        Select-Object -ExpandProperty FullName -Last 1
}

$latestfile | ForEach-Object {
    (Get-Item $_).Directory.Parent
}

但是,如果您在上一步中包含父级,则可以简化此过程:

$latestfile = Get-ChildItem -Path 'path\to\Journ' -Directory | ForEach-Object {
    Get-ChildItem -Path $_.FullName -Filter '*.xml' -File -Recurse |
        Sort-Object LastWriteTime |
        Select-Object FullName, @{ N = 'Parent'; E = { $_.Directory.Parent } } -Last 1
}

这将创建一个对象数组,每个对象都有 2 个属性,即文件的

.FullName
和代表文件目录的父目录的
DirectoryInfo
实例。 An,如果你想得到所有的父母,那就很简单:

$latestfile.Parent
© www.soinside.com 2019 - 2024. All rights reserved.