PowerShell 스크립트에서 폴더를 삭제하기 전에 폴더를 압축하고 싶습니다. 다음을 실행합니다 (스 니펫을 찾은 곳을 기억하지 못합니다).
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)
}
}
이 스 니펫은 실제로 폴더를 압축하지만 비동기 방식으로 압축합니다. 실제로 Shell.Application 개체의 CopyHere 메서드는 압축을 시작하고 완료를 기다리지 않습니다. 스크립트의 다음 문장은 zip 파일 프로세스가 완료되지 않아 엉망이됩니다.
어떤 제안? 가능하다면 실행 파일을 추가하지 않고 순수한 Windows 기능을 유지하고 싶습니다.
내 PS1 파일의 전체 내용에서 DB의 실제 이름을 뺀 것입니다. 스크립트의 목표는 SQL db 세트를 백업 한 다음 현재 날짜로 이름이 지정된 폴더에 단일 패키지로 백업을 압축하는 것입니다.
$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 ..."
2 호선$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")