Trong tập lệnh PowerShell, tôi muốn nén thư mục trước khi xóa thư mục. Tôi chạy như sau (Tôi không nhớ nơi tôi tìm thấy đoạn trích):
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)
}
}
Đoạn mã này thực sự nén thư mục, nhưng theo cách không đồng bộ. Trong thực tế, phương thức CopyHere của các đối tượng Shell.Application bắt đầu nén và không chờ hoàn thành. Các câu lệnh tiếp theo của tập lệnh của tôi sau đó bị rối (vì quá trình tệp zip chưa hoàn thành).
Bất kỳ đề xuất? Nếu có thể, tôi muốn tránh thêm bất kỳ tệp thực thi nào và duy trì các tính năng thuần Windows.
[sửa] toàn bộ nội dung của tệp PS1 của tôi trừ đi tên thật của DB. Mục tiêu của tập lệnh là sao lưu một tập hợp SQL db, sau đó nén các bản sao lưu trong một gói duy nhất trong một thư mục có tên là ngày hiện tại:
$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 ..."
Dòng2:$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")