Bir PowerShell betiğinde, klasörü silmeden önce bir klasörü sıkıştırmak istiyorum. Aşağıdakileri çalıştırıyorum (snippet'i nerede bulduğumu hatırlamıyorum):
function Compress-ToZip
{
param([string]$zipfilename)
if(-not (test-path($zipfilename)))
{
set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(Get-ChildItem $zipfilename).IsReadOnly = $false
}
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
foreach($file in $input)
{
$zipPackage.CopyHere($file.FullName)
}
}
Bu snippet aslında klasörü sıkıştırır, ancak eşzamansız bir şekilde. Aslında, Shell.Application nesnelerinin CopyHere yöntemi sıkıştırmayı başlatır ve tamamlanmasını beklemez. Betiklerimin sonraki ifadeleri daha sonra bozulur (zip dosyası işlemi tamamlanmadığından).
Herhangi bir öneri? Mümkünse yürütülebilir dosyalar eklemekten kaçınmak ve saf Windows özelliklerinde kalmak istiyorum.
[değiştir] PS1 dosyamın tam içeriği eksi DB'nin gerçek adı. Komut dosyasının amacı, bir dizi SQL db'yi yedeklemektir, ardından yedekleri geçerli tarihle adlandırılmış bir klasörde tek bir pakette ziplemektir:
$VerbosePreferenceBak = $VerbosePreference
$VerbosePreference = "Continue"
add-PSSnapin SqlServerCmdletSnapin100
function BackupDB([string] $dbName, [string] $outDir)
{
Write-Host "Backup de la base : $dbName"
$script = "BACKUP DATABASE $dbName TO DISK = '$outDir\$dbName.bak' WITH FORMAT, COPY_ONLY;"
Invoke-Sqlcmd -Query "$script" -ServerInstance "." -QueryTimeOut 600
Write-Host "Ok !"
}
function Compress-ToZip
{
param([string]$zipfilename)
Write-Host "Compression du dossier"
if(-not (test-path($zipfilename)))
{
set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
(Get-ChildItem $zipfilename).IsReadOnly = $false
}
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
foreach($file in $input)
{
$zipPackage.CopyHere($file.FullName)
}
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
$targetDir = "E:\Backup SQL"
$date = Get-Date -format "yyyy-MM-dd"
$newDir = New-Item -ItemType Directory "$targetDir\$date\sql" -Force
BackupDB "database 1" "$newDir"
BackupDB "database 2" "$newDir"
BackupDB "database 3" "$newDir"
Get-Item $newDir | Compress-ToZip "$targetDir\$date\sql_$date.zip"
Write-Host "."
remove-item $newDir -Force -Confirm:$false -Recurse
$VerbosePreference = $VerbosePreferenceBak
Write-Host "Press any key to continue ..."
Satır2:$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")