1

我对脚本和“编程”仍然很陌生。如果您在这里错过任何信息,请告诉我。这是我的工作 zip 功能:

 $folder = "C:\zipthis\"
 $destinationFilePath = "C:\_archive\zipped"

   function create-7zip{
    param([string] $folder, 
    [String] $destinationFilePath)
    write-host $folder $destinationFilePath
    [string]$pathToZipExe = "C:\Program Files (x86)\7-Zip\7zG.exe";
    [Array]$arguments = "a", "-tzip", "$destinationFilePath", "$folder";
    & $pathToZipExe $arguments;
    }

Get-ChildItem $folder | ? { $_.PSIsContainer} | % {
     write-host $_.BaseName $_.Name;
     $dest= [System.String]::Concat($destPath,$_.Name,".zip");
     (create-7zip $_.FullName $dest)
     } 


create-7zip $folder $destinationFilePath

现在我想让他压缩我已经整理好的特殊文件夹:

get-childitem "C:\zipme\" | where-Object {$_.name -eq "www" -or $_.name -eq "sql" -or $_.name -eq "services"}

这个小函数可以找到我需要的 3 个文件夹,称为www, sql and services. 但我没有设法将它插入到我的 zip 函数中,所以这个文件夹被压缩并放入C:\_archive\zipped

因为使用的是字符串而不是数组,所以他总是试图寻找一个不存在的名为 wwwsqlservice 的文件夹。我尝试使用数组放置一个数组,@(www,sql,services)但没有成功,那么正确的方法是什么,如果有的话?它应该与 powershell 2.0 兼容,请不要使用 ps3.0 cmdlet 或函数。

提前致谢!

4

1 回答 1

1

这是一个非常简单的示例,说明您想要做什么,从您的函数上下文中删除。它假定您的目标文件夹已经存在(如果不存在,您可以只使用Test-PathNew-Item创建它们),并且您正在使用 7z.exe。

$directories = @("www","sql","services")  
$archiveType = "-tzip"
foreach($dir in $directories)
{
    # Use $dir to update the destination each loop to prevent overwrites!
    $sourceFilePath = "mySourcePath\$dir"
    $destinationFilePath = "myTargetPath\$dir"

    cmd /c "$pathToZipExe a $archiveType $destinationFilePath $sourceFilePath"
}

总体而言,您似乎非常接近解决方案,需要进行一些小的更改来支持 foreach 循环。如果您确信create-7zip单个文件夹可以正常工作,则可以将其替换为cmd /c上面的行。以下是7zip 在命令行上的一些方便的示例用法列表。

于 2013-09-19T13:22:05.927 回答