在文件夹结构中,例如 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 = 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]: [2]:
好吧,错误太多了, $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
一次处理每个目录 - 这样你只需要 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
}