1

Windows 10 64 位。PowerShell 5.1

使用 PowerShell 5 或 > 更新 zipfile。正在寻找改进的工作代码。

1.1.txt, 1.1.3.txt and 1.txt go in                   FileGroup0000000001.zip
11.txt and 11.1.txt goes in                          FileGroup0000000011.zip 
2.1.3.6.txt, 2.1.3.6.7.txt, 2.1.txt, and 2.txt go in FileGroup0000000002.zip 

使用 PowerShell 5 gci, regex, $Matches, foreach{ $_ PadLeft },更新 zip 文件Compress-Archive, and Remove-Item。平均 29 毫秒 9 个文件 (48KB) 10 次运行 3 个存档。

用于测试清除您的桌面。您的桌面上不应有 .txt 或 .zip 文件。有 3 个Remove-Item没有-whatifor -confirm。制作 9 个文本文件和 3 个 zipfile。工作脚本、测试脚本、带日志文件的脚本。

#credit stackoverflow.com/a/60666329/8826818
pushd %USERPROFILE%\Desktop 
gci *.txt | where BaseName -match "^(\d+)(\.\d+)*$" | group { $Matches[1] } | foreach {
$dest = 'FileGroup' +  $_.Name.PadLeft(10, "0") + ".zip"
Compress-Archive $_.Group $dest -ea Stop -update
ri $_.Group} 
popd

制作测试文件并测试:

pushd %USERPROFILE%\Desktop 
ni @("1.1.txt", "1.txt", "11.txt", "2.1.3.6.txt", "2.1.txt","2.txt") > $null
gci *.txt | where BaseName -match "^(\d+)(\.\d+)*$" | group { $Matches[1] } | foreach {
$dest = 'FileGroup' +  $_.Name.PadLeft(10, "0") + ".zip"
Compress-Archive $_.Group $dest -ea Stop -update
ri $_.Group} 
ni @("1.1.3.txt", "11.1.txt", "2.1.3.6.7.txt") > $null
gci *.txt | where BaseName -match "^(\d+)(\.\d+)*$" | group { $Matches[1] } | foreach {
$dest = 'FileGroup' +  $_.Name.PadLeft(10, "0") + ".zip"
Compress-Archive $_.Group $dest -ea Stop -update
ri $_.Group}
Read-Host @" 

Delete all FileGroup*.zip is next.
There should be nine files in three archives.
Press enter key to delete all test files
"@
ri FileGroup*.zip
# clear-variable -name ("Matches", "dest")
popd 
#

制作测试文件,十个带有日志文件的运行循环:

If(test-path logfile031822_030657692.txt) {
cls 
Write-Output "`r`nOverwrite logfile031822_030657692.txt?`r`nPress any key to continue ...    "
cmd /c pause> nul} 
$zcommandpath=$MyInvocation.MyCommand.Path
Write-Output "`r`nThis is $zcommandpath`r`nHow long to archive 9 text files.`r`nStarted: "((get-date).ToString('MM/dd/yy hh:mm:ss.ffff tt') -replace " : ", ":") | out-file -nonewline -append logfile031822_030657692.txt
$times=@()
$watch = New-Object System.Diagnostics.Stopwatch
for ($zdoug=0;$zdoug -lt 10; $zdoug++){
$watch.Start() #put this at start of the loop
ni @("1.1.txt", "1.txt", "11.txt", "2.1.3.6.txt", "2.1.txt","2.txt") > $null
gci *.txt | where BaseName -match "^(\d+)(\.\d+)*$" | group { $Matches[1] } | foreach {
$dest = 'FileGroup' +  $_.Name.PadLeft(10, "0") + ".zip"
Compress-Archive $_.Group $dest -ea Stop -update
ri $_.Group} 
ni @("1.1.3.txt", "11.1.txt", "2.1.3.6.7.txt") > $null
gci *.txt | where BaseName -match "^(\d+)(\.\d+)*$" | group { $Matches[1] } | foreach {
$dest = 'FileGroup' +  $_.Name.PadLeft(10, "0") + ".zip"
Compress-Archive $_.Group $dest -ea Stop -update
ri $_.Group} 
$times += $watch.Elapsed.TotalSeconds #this at the end
$watch.reset() } 
$zLoopFinished=((get-date).ToString('MM/dd/yy hh:mm:ss.ffff tt') -replace " : ", ":") 
# clear-variable -name ("Matches", "dest", "i") 
# BEGIN DEBUG
# Read-Host @" 
# Delete all FileGroup*.zip is next.
# Press enter key to delete all test files
# "@
#END DEBUG 
ri FileGroup*.zip
popd
#
$times | Measure-Object -sum -ave -max -min
$times | Measure-Object -sum -ave -max -min | out-file -append logfile031822_030657692.txt    
Write-Output "Finished:  $zLoopFinished" | out-file -append logfile031822_030657692.txt    
(gc logfile031822_030657692.txt) | Where { $_.Trim(" `t") }  | select-string -pattern "Property :" -notmatch | out-file logfile031822_030657692.txt
#https://devblogs.microsoft.com/scripting/trim-your-strings-with-powershell/
$NewLine = gc logfile031822_030657692.txt | ForEach-Object {
$_ 
if ($_ -match ('^' + [regex]::Escape( 'Finished:' ))){ " " }}
$NewLine | Out-File logfile031822_030657692.txt -Force 
# 

日志文件:

This is 
How long to archive 9 text files.
Started: 03/15/20 02:56:34.4380 PM
Count    : 10
Average  : 0.38522078
Sum      : 3.8522078
Maximum  : 1.6380882
Minimum  : 0.2281335
Finished:  03/15/20 02:56:39.9413 PM    

如何使用 powershell 解析多于一个点的文件路径、名称、基本名称。

如何将基本名称解析为第一个点。

如何使用 PadLeft。

如何使用 PowerShell 为字符串添加前导零和结尾零。

使用 PowerShell 5 或更高版本更新 zipfile。gci、get-childitem、regex、正则表达式、正则表达式、$Matches、foreach、管道中的当前项、$_、PadLeft、Compress-Archive 和 Remove-Item。在 10 次运行中,3 个存档中的 9 个文件 (48KB) 平均耗时 29 毫秒。

4

1 回答 1

1

使用Group-Object压缩每个组的文件要快一些。

pushd $env:USERPROFILE\Desktop

ni @(
    "1.1.txt"
    "1.txt"
    "11.txt"
    "2.1.3.6.txt"
    "2.1.txt"
    "2.txt"
) > $null

gci *.txt | where BaseName -match "^(\d+)(\.\d+)*$" | group { $Matches[1] } | foreach {
    $dest = 'FileGroup' +  $_.Name.PadLeft(10, "0") + ".zip"
    Compress-Archive $_.Group $dest -Update -ea Stop
    ri $_.Group
}

Read-Host @" 
Delete all FileGroup*.zip is next.
Press enterkey to delete all test files.
"@

ri FileGroup*.zip
popd
于 2020-03-13T07:15:57.060 回答