0

我正在尝试压缩我在名为services.

Get-Childitem用来查找这些文件夹,我想在管道之后添加该功能,但它并没有按照我想要的方式工作。zip 文件应与文件夹本身同名,因此我尝试使用“$ .FullName”命名,而目标路径是文件夹“C:\com\$ .Name”

这是我的脚本:

Get-ChildItem "C:\com\services" | % $_.FullName 


$folder = "C:\com\services"
$destinationFilePath = "C:\com"

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

2 回答 2

1

第一的。声明文件夹和目标路径等变量。

第二。更改您的 7zip 文件夹路径,因为我在 ( Program Files) 中。

 #declare variables
    $folder = "C:\com\services"
    $destPath = "C:\destinationfolder\"

    #Define the function
    function create-7zip{
    param([String] $folder, 
    [String] $destinationFilePath)
    write-host $folder $destinationFilePath
    [string]$pathToZipExe = "C:\Program Files\7-Zip\7z.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)
     } 

$_.PSIsContainer只会找到文件夹,构造目标路径变量$dest,然后调用函数。我希望这有帮助。

于 2013-08-29T15:14:59.663 回答
1

如果我理解正确,您希望将 gci 的输出通过管道传输到 Create-7Zip 函数中,并让该函数创建一个以您传入的每个目录命名的 zip 文件,如下所示:

gci | ?{ $_.PSIsContainer } | Create-7Zip

为此,您需要编写的 cmdlet 以支持从管道中获取值,您可以使用 params() 列表中的 [Parameter] 属性来执行此操作。

function Create-7Zip
{
  param(
    [Parameter(ValueFromPipeline=$True)]
    [IO.DirectoryInfo]$Directory #we're accepting directories from the pipeline.  Based on the directory we'll get the zip name
    );
    BEGIN
    {
        $7Zip = Join-Path $env:ProgramFiles "7-Zip\7z.exe"; #get executable
    }
    PROCESS
    {
        $zipName = $("{0}.zip" -f $Directory.Name);
        $7zArgs = Write-Output "a" "-tzip" $zipName $directory.FullName; #Q&D way to get an array
        &$7Zip $7zArgs
    }
}



Usage:
    #Powershell 3.0
    get-childitem -directory | Create-7Zip
    #Powershell 2
    get-childitem | ?{ $_.PSIsContainer } | Create-7Zip

你会看到 7zip 的输出;您可以通过管道将其传输到其他地方来捕获此信息。

于 2013-08-29T22:42:58.340 回答