使用PowerShell创建Zip文件

时间:2017-05-17 16:59:35

标签: powershell scripting powershell-v2.0

我在C:\ Desktop \ Mobile。

位置有以下这些文件
    Apple_iphone6.dat
    Apple_iphone7.dat
    Samsung_edge7.dat
    Samsung_galaxy.dat
    Sony_experia.dat
    Sony_M2.dat

我需要创建一个将类似文件写入单个zip的脚本。所以文件Apple_iphone6.dat和Apple_iphone7.dat必须是单个zip。 所以创建的最终zip文件将是:

Apple_Files_Timestamp.zip
Samsung_Files_Timestamp.zip
Sony_Files_Timestamp.zip

我试过这个

Get-ChildItem C:\Desktop\Mobile -Recurse -File -Include *.dat | Where-Object { $_.LastWriteTime -lt $date } | Compress-Archive -DestinationPath C:\Desktop\Mobile

但它给了我错误' Compress-Archive'不被识别为cmdlet的名称。

如何才能使此代码生效?

4 个答案:

答案 0 :(得分:2)

Pre Powershell v5你可以使用它。无需额外下载。

$FullName = "Path\FileName"
$Name = CompressedFileName
$ZipFile = "Path\ZipFileName"
$Zip = [System.IO.Compression.ZipFile]::Open($ZipFile,'Update')
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($Zip,$FullName,$Name,"optimal")
$Zip.Dispose()

答案 1 :(得分:2)

你有两个问题,我会尝试总结这两个问题。

<强> 1。压缩文件

要使用Compress-Archive命令,您需要使用@LotPings已评论的PowerShell 5。你可以:

  • 在Windows 10计算机上运行您的脚本,或运行v5
  • 的Server 2016
  • 下载并安装PoSh 5,详见MSDN

如果你不能做其中任何一个,你可以

  • 从PowerShell库安装一些模块,通过7-zip工具提供类似的功能。搜索结果为here。使用前下载并检查这些模块!
  • 使用.NET 4.5类,在Stack Overflow上查看answer

<强> 2。分组文件

对文件进行分组后,您可以轻松地将它们用于压缩命令,就像您已经尝试过的那样。正确的分组将通过以下方式实现:

$Files = Get-ChildItem 'C:\Desktop\Mobile'
$Groups = $Files | ForEach-Object {($_.Name).split('_')[0]} | Select-Object -Unique

foreach ($Group in $Groups) {
    $Files | where Name -Match "^$Group" | Compress-Archive "C:\Desktop\Mobile\$Group.7z"
}

答案 2 :(得分:0)

使用Powershell 2.0您无法使用Compress-Archive,您需要下载原始终端可执行文件以从here压缩和解压缩文件。

您可以使用:

zip <path> <zip_name> -i <pattern_files>

在你的例子中:

zip "C:\Desktop\Mobile" Apple_Files_Timestamp.zip -i Apple*.dat
zip "C:\Desktop\Mobile" Samsung_Files_Timestamp.zip -i Samsung*.dat
zip "C:\Desktop\Mobile" Sony_Files_Timestamp.zip -i Sony*.dat

如果您需要使用adittional zip选项,请访问zip manual

答案 3 :(得分:0)

  • 以下脚本执行分组
  • zipping命令取决于您选择的拉链。
$TimeStamp = Get-Date -Format "yyyyMMddhhmmss"
Get-ChildItem *.dat|
  Group-Object {($_.Name).split('_')[0]}|
    ForEach-Object {
      $Make = $_.Name
      Foreach($File in $_.Group){
        "{0,20} --> {1}_Files_{2}.zip" -f $File.Name,$Make,$TimeStamp
      }
}

示例输出:

> .\SO_44030884.ps1
   Samsung_edge7.dat --> Samsung_Files_20170517081753.zip
  Samsung_galaxy.dat --> Samsung_Files_20170517081753.zip
   Apple_iphone6.dat --> Apple_Files_20170517081753.zip
   Apple_iphone7.dat --> Apple_Files_20170517081753.zip
         Sony_M2.dat --> Sony_Files_20170517081753.zip
    Sony_experia.dat --> Sony_Files_20170517081753.zip

此链接可能会有助Module to Synchronously Zip and Unzip using PowerShell 2.0