您可以使用 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 路径应该工作得很好——它们是由环回处理的,所以数据不通过网络。
我有一个由服务器 (\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 路径应该工作得很好——它们是由环回处理的,所以数据不通过网络。