0

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

这是我到目前为止所拥有的:

$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

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

4

1 回答 1

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
}
于 2012-07-24T12:25:04.337 回答