该脚本使用 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 中的另一个 foreach 循环中使用在一个 foreach 循环中生成的变量。但是,您需要记住一些注意事项:
$项目 = @(1, 2, 3, 4, 5)
foreach($items 中的$item){ 写入输出“处理项目:$item”
# Use the $item variable in the first loop
# Second foreach loop
foreach($items 中的$anotherItem){ 写入输出“处理另一个项目:基于 $item 的 $anotherItem”
}
}
正如 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