In einem PowerShell-Skript möchte ich einen Ordner komprimieren, bevor ich den Ordner lösche. Ich führe Folgendes aus (ich erinnere mich nicht, wo ich das Snippet gefunden habe):
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)
}
}
Dieses Snippet komprimiert den Ordner tatsächlich, jedoch auf asynchrone Weise. Tatsächlich startet die CopyHere-Methode der Shell.Application-Objekte die Komprimierung und wartet nicht auf ihren Abschluss. Die nächsten Anweisungen meiner Skripte sind dann durcheinander (da der Zip-Datei-Prozess nicht abgeschlossen ist).
Irgendwelche Vorschläge? Wenn möglich, möchte ich das Hinzufügen ausführbarer Dateien vermeiden und mich auf reine Windows-Funktionen beschränken.
[Bearbeiten] Vollständiger Inhalt meiner PS1-Datei abzüglich des tatsächlichen Namens der Datenbank. Das Ziel des Skripts besteht darin, eine Reihe von SQL-Datenbanken zu sichern und dann die Sicherungen in einem einzelnen Paket in einem Ordner mit dem aktuellen Datum zu komprimieren:
$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 ..."
Linie 2:$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")