在 powershell 中构建 7-zip 命令字符串

Posted

技术标签:

【中文标题】在 powershell 中构建 7-zip 命令字符串【英文标题】:Building a 7-zip command string in powershell 【发布时间】:2012-07-24 12:04:46 【问题描述】:

我第一次在 Powershell 中探索真正的应用程序;我可以用传统的 .Net 语言编写代码,但我认为 Powershell 非常适合此类控制台应用程序。我搜索了 *** 并找到了我需要的(几乎)确切的脚本;我的问题是我想获取一个文件文件夹(在服务器 fsA 上)并在 fsB 上创建以文件日期命名的 7-Zip 存档。例如,在 2012 年 7 月 21 日最后写入的所有文件都可以在存档 20120721.7z 中找到。我基于这里找到的解决方案:Create a 7z Archive for files created by date using Powershell

这是我目前所拥有的:

$prog_dir = "C:\Progra~1\7-Zip\7z.exe"
$archive_dir = "\\fsa\Backup"
$input_dir = "\\fsb\Xml\Archive\"
$7zOpts = "-m0=PPMd:o32:mem192M"
$groups = dir $input_dir | group-object -property $_.LastWriteTime.Date
$groups | foreach$cmd = $prog_dir + " a " + $archive_dir + "\$((Get-Date $_.Name).ToString(`"yyyyMMdd`")).7z $([string]::join(`" `", $_.Group)) " + $7zOpts #; invoke-expression $cmd
#
#Where to put this: "+ $input_dir +"???
#
$cmd

我似乎找不到在 foreach 行中指定输入目录的方法;我可以将它放在 join 语句的开头,但它只会将输入目录添加到列表中的第一个文件。例如:

$groups | foreach$cmd = $prog_dir + " a " + $archive_dir + "\$((Get-Date $_.Name).ToString(`"yyyyMMdd`")).7z " + $input_dir + "$([string]::join(`" `", $_.Group)) " + $7zOpts #; invoke-expression $cmd

产生输出

C:\Progra~1\7-Zip\7z.exe a \\fsa\Backup\20120722.7z \\fsb\Xml\Archive\255IQR.xml 2573WV.xml 257RMC.xml

最后两个文件的前面没有完整路径?我做错了什么?

【问题讨论】:

这不是您当前问题的答案,而是一些建议:每当我想使用 PowerShell 压缩或解压缩内容时,我都会通过 SevenZipSharp 使用 7zip。我会花时间实现它,而不是试图让这个命令行按照你的意愿行事。如果您需要有关如何执行此操作的帮助,请告诉我,我可以为您指出一些文档或写一些东西。 @chris-n:我已经看到了一些东西;也许这是一个更好的方法。我会调查的。同时,您可以指出我的任何内容将不胜感激。 【参考方案1】:

PowerShell 是一个 shell,因此运行命令几乎是它应该做好的 事情。所以一般来说,如果你在运行命令时诉诸Invoke-Expression,你就做错了。让我们尝试不同的方式:

$prog_dir = 'C:\Progra~1\7-Zip\7z.exe' # you don't need 8.3 names here, by the way
$archive_dir = '\\fsa\Backup'
$input_dir = '\\fsb\Xml\Archive\'
$7zOpts = '-m0=PPMd:o32:mem192M'
$groups = dir $input_dir | group-object -property $_.LastWriteTime.Date
$groups | foreach 
    $files = $_.Group | select -expand FullName
    $date = (Get-Date $_.Name).ToString('yyyyMMdd')
    & $prog_dir a $archive_dir\$date.7z $files $7zOpts

【讨论】:

感谢您的快速响应;但是,有几个问题。执行会引发错误:Get-Date : Cannot bind parameter 'Date' to the target。异常设置“日期”:“对象引用未设置为对象的实例。”并将所有文件压缩到一个存档中。如果有不同日期的文件,目的是让它们位于根据日期命名的不同档案中。 这是为了替换 ForEach-Object 脚本块的内容。您在其中创建 $cmdiex 它。 我为如此密集而道歉;所以该行变为 $groups | foreach$files = $_.Group | % $input_dir + $_ ;& $prog_dir a $archive_dir\$((Get-Date $_.Name).ToString('yyyyMMdd')).7z $files $7zOpts ? 这就是意图,是的。我用完整的脚本编辑了答案,还修改了一些部分(例如,使用 FullName 属性而不是连接路径和文件名)。

以上是关于在 powershell 中构建 7-zip 命令字符串的主要内容,如果未能解决你的问题,请参考以下文章

在不压缩的 Powershell 上使用 7zip

在后台运行 powershell 命令

7-Zip 命令在 Windows 上创建和提取受密码保护的 ZIP 文件? [关闭]

Powershell构建步骤,火灾和忘记?

java如何在windows下使用命令行调用7-zip进行分卷压缩和解压缩

7-zip SFX 配置问题 [关闭]