您可以使用 PowerShell 压缩网络共享上的文件而不将它们下载到客户端吗?

Can you compress files on a network share using PowerShell without downloading them to the client?

我有一个由服务器 (\SERVER) 托管的网络共享,其他 servers/clients 正在访问该服务器。

\SERVER\SHARE\Folder\File

如果我想压缩 Folder 和其中的所有内容,是否可以使用 PowerShell 而无需将文件下载到作为 运行 命令的计算机?

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

PowerShell 的 Invoke-Command 选项怎么样?

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

当 运行 下面的 PowerShell 命令

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

Exception calling "Write" with "3" argument(s): "Stream was too long." At C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:820 char:29 + ... $destStream.Write($buffer, 0, $numberOfBytesRead) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IOException

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

The Compress-Archive cmdlet uses the Microsoft .NET API System.IO.Compression.ZipArchive to compress files. The maximum file size is 2 GB because there's a limitation of the underlying API.

至于解决方案,压缩较小的文件,或使用其他工具,如 7zip。有 a module 可用,但手动压缩并不那么复杂。由于 7zip 不是本机工具,因此请安装它或安装 Powershell 模块。

Set-Alias sz "$env:ProgramFiles-Zipz.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 路径应该工作得很好——它们是由环回处理的,所以数据不通过网络。