I ' m с помощью скрипта с сайта по ссылке . Но он архивирует каталог. Я бы предпочел, чтобы он архивировал только файлы внутри этого каталога, а имя zip-файла должно быть directory.zip.
Вот функция ZipFolder . Может ли кто-нибудь сказать мне, что нужно изменить, чтобы заархивировать только файлы внутри каталога?
function ZipFolder(
[IO.DirectoryInfo] $directory)
{
If ($directory -eq $null)
{
Throw "Value cannot be null: directory"
}
Write-Host ("Creating zip file for folder (" + $directory.FullName + ")...")
[IO.DirectoryInfo] $parentDir = $directory.Parent
[string] $zipFileName
If ($parentDir.FullName.EndsWith("\") -eq $true)
{
# e.g. $parentDir = "C:\"
$zipFileName = $parentDir.FullName + $directory.Name + ".zip"
}
Else
{
$zipFileName = $parentDir.FullName + "\" + $directory.Name + ".zip"
}
If (Test-Path $zipFileName)
{
Throw "Zip file already exists ($zipFileName)."
}
Set-Content $zipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
$shellApp = New-Object -ComObject Shell.Application
$zipFile = $shellApp.NameSpace($zipFileName)
If ($zipFile -eq $null)
{
Throw "Failed to get zip file object."
}
[int] $expectedCount = (Get-ChildItem $directory -Force -Recurse).Count
$expectedCount += 1 # account for the top-level folder
$zipFile.CopyHere($directory.FullName)
# wait for CopyHere operation to complete
WaitForZipOperationToFinish $zipFile $expectedCount
Write-Host -Fore Green ("Successfully created zip file for folder (" `
+ $directory.FullName + ").")
}
#Remove-Item "C:\NotBackedUp\Fabrikam.zip"
[IO.DirectoryInfo] $directory = Get-Item "D:\tmp"
ZipFolder $directory
Обнаружен альтернативный метод из serverfault
$srcdir = "H:\Backup"
$zipFilename = "test.zip"
$zipFilepath = "K:\"
$zipFile = "$zipFilepath$zipFilename"
#Prepare zip file
if(-not (test-path($zipFile))) {
set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(dir $zipFile).IsReadOnly = $false
}
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipFile)
$files = Get-ChildItem -Path $srcdir | where{! $_.PSIsContainer}
foreach($file in $files) {
$zipPackage.CopyHere($file.FullName)
#using this method, sometimes files can be 'skipped'
#this 'while' loop checks each file is added before moving to the next
while($zipPackage.Items().Item($file.name) -eq $null){
Start-sleep -seconds 1
}
}
Прежде всего, добро пожаловать.
Если вы прочитаете код, вы увидите, что папка скопирована здесь, в zip-файл:
$zipFile.CopyHere($directory.FullName)
Что вам нужно сделать вместо этого нужно скопировать отдельные файлы в каталог.
В основном вам нужно cd в каталог и скопировать каждый childItem.
cd $Directory.FullName
foreach ($f in (get-childItem .))
{
$zipFile.CopyHere($f)
}
Обратите внимание, что вам также придется удалить:
$expectedCount += 1 # account for the top-level folder
Попробуйте это, обратите внимание, что у меня есть обратите внимание, тестировал / отлаживал его вообще, это просто псевдокод, как бы я это сделал. Powershell хорош и мощен, но требует обучения.