是否可以组合5个foreach循环?

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

在文件夹结构中,例如 50 个文件夹及其子文件夹,在这 50 个结构中的每一个中,每天都会生成一个新文件。该文件通过 foreach 获取到数组 $latestfile 中。这效果很好。 接下来,我必须获取文件夹名称,为每个文件夹名称添加 1,并使用该名称(数字)创建一个新文件夹。现在每个文件夹结构的最新文件必须分别保存在新文件夹中,并压缩。

文件夹结构如下所示:

C:\Users\..\Journ\MYBOFFID.901 (MYBOFFID like different stations)
                      .
                      .
                      MYBOFFID.968\201911 (year and month)
                                      .
                                      .
                                    202401\1 (day)
                                           .
                                           .
                                           30\1028\fiscal.xml

[![在此处输入图像描述][1]][1]

名为fiscal.xml的文件,每天,获取最新文件,上面两层,每日文件夹,创建一个新文件夹,+1,将最新的fiscal.xml复制并压缩到新文件夹中。

第一个循环运行良好:

$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 FullName, @{ N = 'Parent'; E = { $_.Directory.Parent } } -Last 1 
        
}

$folder_number = $latestfile.Parent.Name

echo $latestfile.Parent.Name

接下来我必须为每个文件夹编号添加 1:

#Add 1 to $folder_name_number, Add number to existing value
foreach ($n in $folder_number){
    $n = $n + 1
}

echo $n

然后必须创建一个新文件夹,继承最新文件,分别为每个:

#Create new folder with new number
foreach ($n in $folder_number){
New-Item -Path "C:\Users\User\Documents\fiscal\$new_folder_number" -Type Directory
}

然后这些文件中的每一个都必须被压缩并分别放入新文件夹中。


#Zipping and Copying to Destination
foreach ($l in $latestfile){
Compress-Archive $latestfile -DestinationPath "C:\Users\User\Documents\fiscal\$new_folder_number"
}

这是输出:

PS C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ> C:\Users\User\Documents\ps\array_pipe_parent.ps1
20
23
.
.
.
21
211
new
folder
to
be
created
:
New-Item : Ein Element mit dem angegebenen Namen "C:\Users\User\Documents\fiscal\" ist bereits vorhanden.
In C:\Users\User\Documents\ps\array_pipe_parent.ps1:24 Zeichen:1
+ New-Item -Path "C:\Users\User\Documents\fiscal\$new_folder_number" -T ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    .
    .(several times, always the same)
    .
New-Item : Ein Element mit dem angegebenen Namen "C:\Users\User\Documents\fiscal\" ist bereits vorhanden.
In C:\Users\User\Documents\ps\array_pipe_parent.ps1:24 Zeichen:1
+ New-Item -Path "C:\Users\User\Documents\fiscal\$new_folder_number" -T ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceExists: (C:\Users\User\Documents\fiscal\:String) [New-Item], IOException
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand

And:

 this path is not even mentioned in the script:
Compress-Archive : Der Pfad 
"@{FullName=C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.901\202312\20\1705\fiscal.xml; Parent=20}" ist entweder 
nicht vorhanden oder entspricht keinem gültigen Dateisystempfad.
In C:\Users\User\Documents\ps\array_pipe_parent.ps1:29 Zeichen:1
+ Compress-Archive $latestfile -DestinationPath "C:\Users\User\Document ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (@{FullName=C:\U...xml; Parent=20}:String) [Compress-Archive], InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive
                      .
                      .
                      . (several times, the same)


 

我现在正在尝试不同的方法:

  • 获取数组$latestfile,foreach/Sort-Object
  • 获取日期作为新文件夹名称(数字)
  • 如果月日 = 1,则创建一个新的父文件夹,名称 = -UFormat %Y%d
  • 否则:创建新文件夹
  • 将每个 $latest 文件复制并压缩到新文件夹中

    $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 FullName, @{ N = 'Parent'; E = { $_.Directory.Parent } } -Last 1 
        
}

#$folder_number = $latestfile.Parent.Name

Get-Date -UFormat "%d" = $new_folder_number
Get-Date -UFormat "%Y%m" = $new_parentfolder_month


echo new folder to be created : $new_folder_number

#Create new folder with new number, if monthday = 1, a new folder is created
if($new_folder_number = 1){foreach ($l in $latestfile){
New-Item -Path "C:\Users\User\Documents\fiscal\$new_parentfolder_month\$new_folder_number" -Type Directory
}}
    else{

    {foreach ($l in $latestfile){
New-Item -Path "C:\Users\User\Documents\fiscal\$new_folder_number" -Type Directory
}}}

#Zipping and Copying to Destination
foreach ($l in $latestfile){
Compress-Archive $latestfile -DestinationPath "C:\Users\User\Documents\fiscal\$new_folder_number"
}

现在的输出是:

Compress-Archive : Der Pfad 
"@{FullName=C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.901\202312\20\1705\fiscal.xml; Parent=20}" ist entweder 
nicht vorhanden oder entspricht keinem gültigen Dateisystempfad.
In C:\Users\User\Documents\ps\array_pipe_parent.ps1:28 Zeichen:1
+ Compress-Archive $latestfile -DestinationPath "C:\Users\User\Document ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (@{FullName=C:\U...xml; Parent=20}:String) [Compress-Archive], InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive
 
Compress-Archive : Der Pfad 
"@{FullName=C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.901\202312\20\1705\fiscal.xml; Parent=20}" ist entweder 
nicht vorhanden oder entspricht keinem gültigen Dateisystempfad.
In C:\Users\User\Documents\ps\array_pipe_parent.ps1:28 Zeichen:1
+ Compress-Archive $latestfile -DestinationPath "C:\Users\User\Document ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (@{FullName=C:\U...xml; Parent=20}:String) [Compress-Archive], InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive
[enter image description here][2]

路径虽然存在,并且 .xml 文件也存在 [1]:https://i.stack.imgur.com/oGvYZ.png [2]:https://i.stack.imgur.com/l7Ssc.png

好吧,错误太多了, $latestfile 部分有效,给出最新文件和父文件夹。 然后我想从 get-Date 获取日期作为变量,这是一个问题

$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 FullName, @{ N = 'Parent'; E = { $_.Directory.Parent } } -Last 1 
        
}

echo $latestfile

$folder_number = $latestfile.Parent.Name

echo $folder_number

Get-Date -UFormat "%d" = $new_folder_number

echo $new_folder_number

输出:

.
.
.
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.942\202312\23\1107\fiscal.xml 23    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.943\202312\23\1106\fiscal.xml 23    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.944\202312\19\1116\fiscal.xml 19    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.945\202311\25\1238\fiscal.xml 25    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.946\201812\23\1536\fiscal.xml 23    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.947\202312\17\1101\fiscal.xml 17    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.948\202312\17\1108\fiscal.xml 17    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.950\201912\22\1015\fiscal.xml 22    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.953\201912\22\1207\fiscal.xml 22    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.954\201912\23\1202\fiscal.xml 23    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.960\201907\21\0314\fiscal.xml 21    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.961\201907\21\0318\fiscal.xml 21    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.962\201907\21\0322\fiscal.xml 21    
C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ\MYBOFFID.964\201907\21\0255\fiscal.xml 21    
20
23
05
23
23
23
16
03
23
23
.
.
.
21
Get-Date : Der Parameter "Date" kann nicht gebunden werden. Der Wert "=" kann nicht in den Typ "System.DateTime" konvertiert werden. Fehler: "Die 
Zeichenfolge wurde nicht als gültiges DateTime erkannt."
In C:\Users\User\Documents\ps\latestfile_get_date.ps1:14 Zeichen:24
+ Get-Date -UFormat "%d" = $new_folder_number
+                        ~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
powershell foreach nested foreach-object
1个回答
0
投票

一次处理每个目录 - 这样你只需要 1 个循环:

Get-ChildItem -Path 'C:\Users\User\Documents\VersandvorbMitDaten\Versandvorbereitung\Journ' -Directory | ForEach-Object {
    $currentBaseDir = $_
    $latestFile = $currentBaseDir |Get-ChildItem -Filter '*.xml' -File -Recurse |Sort-Object LastWriteTime |Select-Object -Last 1 

    if (-not $latestFile) {
        Write-Warning "No xml file found in $($currentBaseDir.Name)"
        return
    }

    # identify the date associated with the latest file
    $dirSep = [System.IO.Path]::DirectorySeparatorChar
    $month,$day,$null = $latestFile.FullName.Substring($currentBaseDir.Length).TrimStart($dirSep).Split($dirSep)
    $folderDate = [datetime]::ParseExact("${month}${day}", 'yyyyMMdd', $null)

    # add 1 day to folder date
    $folderDate = $folderDate.AddDays(1)

    # construct new path
    $nextFolderPath = Join-Path $currentBaseDir.FullName $($folderDate |Get-Date -Format 'yyyyMM\\dd')

    # create folder if it doesn't exist
    if (-not (Test-Path -LiteralPath $nextFolderPath)) {
        mkdir $nextFolderPath -Force |Out-Null
    }

    $destinationPath = Join-Path $nextFolderPath 'fiscal.xml.zip'
    # compress to zip
    $latestFile |Compress-Archive -DestinationPath 

    # clean up (remove `-WhatIf` to actually delete it)
    $latestFile |Remove-Item -WhatIf
}
© www.soinside.com 2019 - 2024. All rights reserved.