代码之家  ›  专栏  ›  技术社区  ›  RayofCommand

如何使用powershell在zip函数中使用数组?

  •  1
  • RayofCommand  · 技术社区  · 11 年前

    我对脚本和“编程”还是很陌生的。如果你错过了这里的任何信息,请告诉我。 这是我的工作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或函数。

    提前谢谢!

    1 回复  |  直到 11 年前
        1
  •  1
  •   Anthony Neace    11 年前

    这里有一个非常简单的例子,说明了您想要做什么,从函数的上下文中删除。它假设您的目标文件夹已经存在(您可以使用 Test-Path New-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 上面的行。这里有一些方便的清单 example usages 用于命令行上的7zip。