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

我第一次在 Powershell 中探索真正的应用程序;我可以用传统的 .Net 语言编写代码,但我认为 Powershell 非常适合此类控制台应用程序。我搜索了 StackOverflow 并找到了我需要的(几乎)确切的脚本;我的问题是我想获取一个文件文件夹(在服务器 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:我已经看到了一些东西;也许这是一个更好的方法。我会调查的。同时,您可以指出我的任何内容将不胜感激。

标签: powershell


【解决方案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 属性而不是连接路径和文件名)。
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2012-09-08
  • 2021-05-13
相关资源
最近更新 更多