【问题标题】:Can you compress files on a network share using PowerShell without downloading them to the client?您可以使用 PowerShell 压缩网络共享上的文件而不将它们下载到客户端吗?
【发布时间】:2020-05-19 03:32:29
【问题描述】:

我有一个由其他服务器/客户端访问的服务器 (\SERVER) 托管的网络共享。

\\SERVER\SHARE\Folder\File

如果我想压缩 Folder 和其中的所有内容,是否可以使用 PowerShell 而不将文件下载到运行该命令的机器上?

问题文件较大,C盘空间不足,无法在客户端下载压缩文件。因此,例如,如果我使用 Windows 文件资源管理器从客户端导航到网络共享,并选择要压缩的文件夹,它将开始将文件下载到客户端,然后由于客户端上的可用空间不足而失败。

PowerShell 的 Invoke-Command 选项怎么样?

我确实可以选择从客户端调用命令到服务器,但是,\SERVER 的 C 驱动器太小,无法处理请求。有一个 D 驱动器(承载实际的 \SHARE),但它有足够的空间。我必须告诉 PowerShell 以某种方式压缩该驱动器上的文件,而不是默认的 C 驱动器。

运行以下 PowerShell 命令时出错

Compress-Archive -Path "\\SERVER\SHARE\Folder" -DestinationPath "\\SERVER\SHARE\OtherFolder\Archive.zip"

使用“3”个参数调用“Write”的异常:“流太长。” 在 C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:820 字符:29 + ... $destStream.Write($buffer, 0, $numberOfBytesRead) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IOException

【问题讨论】:

    标签: windows powershell compression network-share


    【解决方案1】:

    问题是由 Compress-Archive 的限制引起的。其最大文件大小为2 GB。文档提到了这一点:

    Compress-Archive cmdlet 使用 Microsoft .NET API System.IO.Compression.ZipArchive 用于压缩文件。最大文件 大小为 2 GB,因为存在底层 API 的限制。

    至于解决方案,压缩较小的文件,或使用其他工具,例如 7zip。有a module 可用,尽管手动压缩并不复杂。由于 7zip 不是原生工具,请安装它或 Powershell 模块。

    Set-Alias sz "$env:ProgramFiles\7-Zip\7z.exe"
    
    $src = "D:\somedir"
    $tgt = "D:\otherdir\archive.7z"    
    sz a $tgt $src 
    

    如果源文件足够小,以至于单个文件永远不会创建大于限制的存档,请考虑单独压缩每个文件。一个例子是这样的,

    $srcDir = "C:\someidir"
    
    $dstDir = "D:\archivedir"
    # List all the files, not subdirs
    $files = gci $srcDir -recurse | ? { -not $_.PSIsContainer }
    
    foreach($f in $files) {
      # Create new name for compressed archive. Add file path, but
      # replace \ with _ so there are no name collisions.
      $src = $f.FullName
      $dst = "c:\temppi\" + $src.Replace('\', '_').Replace(':','_') + ".zip"
      Compress-Archive -whatif -Path $src -DestinationPath $dstDir
    }
    

    附带说明:使用 Enter-PSSession 或 Inoke-Command 在文件服务器上运行脚本。在那里您可以使用本地路径,但 UNC 路径应该可以很好地工作 - 这些路径由环回处理,因此数据不会通过网络。

    【讨论】:

    • 运行 sz $src $tgt 给了我“不支持的命令:\\SERVER\SHARE\Folder”
    • @PieDev 修复了外部命令的语法。使用sz -? 获取7zip 的在线使用帮助。
    • 使用7z a $src $tgt 给我一个警告说WARNING: The system cannot find the file specified. <$tgt path>
    • 7z a $tgt $src 成功了。没有注意到最后一次编辑切换了这两个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2017-11-10
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多