我正在尝试压缩我在名为services
的文件夹中找到的所有文件夹。
我使用Get-Childitem
来查找这些文件夹,我想在管道之后添加该功能,但它不能按我想要的方式工作。
zip文件应该与文件夹本身具有相同的名称,因此我尝试使用“$ .FullName”命名,destinationpath是文件夹“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;
}
答案 0 :(得分: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
,然后调用该函数。我希望这会有所帮助。
答案 1 :(得分: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的输出;您可以通过将其传送到其他地方来捕获此信息。