首页 > 解决方案 > 每个文件压缩文件,同名

问题描述

我希望你们在 COVID-19 的这段时间都安全。

我正在尝试生成一个脚本,该脚本进入目录并将每个文件压缩为与文件同名的 .zip,例如:

sample.txt -> sample.zip
sample2.txt -> sample2.zip

但是我遇到了困难,我不习惯powershell,我正在学习和改进这个脚本。最后,它将是一个脚本,删除早于 X 天的文件,压缩文件并使它们在 ftp 中上传.. 排除超过 X 的部分我已经管理了几天,现在我抓住了一点这个。

此刻最后一次尝试。

param
(
    #Future accept input
    [string] $InputFolder,
    [string] $OutputFolder
)

    #test folder
$InputFolder= "C:\Temp\teste"
$OutputFolder="C:\Temp\teste"

$Name2 = Get-ChildItem $InputFolder -Filter '*.csv'| select Name

Set-Variable SET_SIZE -option Constant -value 1
$i = 0
$zipSet = 0




Get-ChildItem $InputFolder | ForEach-Object { 
    $zipSetName =  ($Name2[1]) + ".zip "
    Compress-Archive -Path $_.FullName -DestinationPath "$OutputFolder\$zipSetName"
    $i++;
    $Name2++

    if ($i -eq $SET_SIZE) {
        $i = 0;
        $zipSet++;
        }
}

标签: powershell

解决方案


您可以稍微简化一下,看起来大多数问题是因为在您的脚本示例$Name2中将包含一组Get-ChildItem $InputFolder与循环中返回的项目不同的项目(即可能有文件以外的其他对象.csv)。

处理事情的最好方法是将变量与完整的文件对象一起使用(即您不需要使用|select name)。因此,我立即获取所有 CSV 文件对象并将其存储在变量$CsvFiles.

我们还可以$_ForEach-Object其中使用特殊变量来表示当前对象。我们也可以使用$_.BaseName不带扩展名的名称给我们(假设这是您想要的,否则用于$_Name获取名称为 的 zip xyz.csv)。

所以代码的简化版本可以是:

$InputFolder= "C:\Temp\teste"
$OutputFolder="C:\Temp\teste"

#Get files to process
$CsvFiles = Get-ChildItem $InputFolder -Filter '*.csv'

#loop through all files to zip
$CsvFiles | ForEach-Object { 
    $zipSetName =  $_.BaseName + ".zip"
    Compress-Archive -Path $_.FullName -DestinationPath "$OutputFolder\$zipSetName"
}

推荐阅读