 |
|
Tonny_Bennet |
18-09-2012 12:25 1990785 |
Exit Codes при запуске 7z.exe
Здравствуйте.
Пишу скрипт архивирования баз SQL. Хочется сделать, что бы при завершении работы архиватора можно было анализировать код возврата. У 7-zip их не много, и фактически меня интересует только один - "0". Если архивация прошла успешно то я удалю исходный файл.
Запускаю процесс при помощи start-process.
Пробовал, использовать $lastexitcode. При запуске скрипта вручную начинают появляться консольные окна 7z.exe, в которых отображается прогресс сжатия в процентах. Если этот процесс доходит до 100% - создаётся нормальный архив и $lastexitcode равен 1. Если прервать процесс архивации - $lastexitcode всё равно равен 1.
Текст скрипта
Код:
#папка в которой лежат подпапки с бекапами
$source_dir = "C:\Backup\"
#папка в которой создаются подпапки с хапакованными бекапами
$backup_dir = "C:\Arh\"
#фильтр файлов с бекапами
$files_filter ="*.bak"
#путь к архиватору
$arhivator = "C:\Program Files\7-Zip\7z.exe"
#смотрим какие подпапки есть в исходной папке с бекапами
$source_dirs = get-childitem -path $source_dir | where-object {$_.PSIsContainer}
#echo $source_dirs
#перебираем все подпапки
foreach($dir in $source_dirs)
{
#получаем имена файлов в текущем каталоге
$filenames = get-childitem -path $source_dir$dir -name -include $files_filter
foreach($filename in $filenames)
{
$substr = $filename.Split("_");
$folder = $substr[0]
$year = $substr[2]
$month = $substr[3]
$curent_dir = $backup_dir
if ($folder -ne $null)
{
$curent_dir = $curent_dir + $folder+ '\'
if ($year -ne $null)
{
$curent_dir = $curent_dir + $year + '\'
if ($month -ne $null)
{
$curent_dir = $curent_dir + $month + '\'
}
}
}
start-process -Wait $arhivator (" a " + ($curent_dir + $filename + ".zip" ) + " " + ($source_dir + $dir + '\' + $filename))
#удаляем файл если создан его архив
if (get-item ($curent_dir + $filename + ".zip") | where-object {$_.exists})
{
#и код возврата равен 0
if ($lastexitcode -eq 0)
{
Remove-Item ($source_dir + $dir + '\' + $filename)
echo $source_dir $dir '\' $filename is deleted - exit: $lastexitcode
}
else
{
echo ($source_dir + $dir + '\' + $filename + "is not deleted - exit:" + $lastexitcode)
}
}
}
}
Подскажите пожалуйста как реализовать проверку кодов возврата?
|
Лучше использовать .Net:
Код:
$cmd = "a " + ($curent_dir + $filename + ".zip" ) + " " + ($source_dir + $dir + '\' + $filename)
$pi = New-Object Diagnostics.ProcessStartInfo -Property @{
FileName = $arhivator
Arguments = $cmd
}
$pr = [Diagnostics.Process]::Start($pi)
$pr.WaitForExit()
$pr.ExitCode
|
Ключевое слово — «that was run». Из самого скрипта. Start-Process к нему не относится.
читать дальше »
Код:
$oProcess = New-Object -TypeName "System.Diagnostics.Process"
$oProcess.StartInfo = New-Object -TypeName "System.Diagnostics.ProcessStartInfo"
$oProcess.StartInfo.FileName = "c:\Program Files\7-zip\7z.exe"
$oProcess.StartInfo.Arguments = "argument list"
$oProcess.StartInfo.WindowStyle = 1
if($oProcess.Start()) {
[void]$oProcess.WaitForExit()
Write-Host $oProcess.ExitCode
} else {
Write-Host "Can't start process"
}
$oProcess.Dispose()
|
Tonny_Bennet |
18-09-2012 16:04 1990886 |
Kazun, спасибо. Использовал ваш вариант. Всё заработало. Ниже код подправленного скрипта если кому-нибудь понадобится.
Iska, благодарю за ответ, пока времени проверить работоспособность нет, но дуамаю ваш пример тоже кому-нибудь пригодится.
Текст скрипта
Код:
#папка в которой лежат подпапки с бекапами
$source_dir = "C:\Backup\"
#папка в которой создаются подпапки с хапакованными бекапами
$backup_dir = "C:\Arh\"
#фильтр файлов с бекапами
$files_filter ="*.bak"
#путь к архиватору
$arhivator = "C:\Program Files\7-Zip\7z.exe"
#смотрим какие подпапки есть в исходной папке с бекапами
$source_dirs = get-childitem -path $source_dir | where-object {$_.PSIsContainer}
#перебираем все подпапки
foreach($dir in $source_dirs)
{
#получаем имена файлов в текущем каталоге
$filenames = get-childitem -path $source_dir$dir -name -include $files_filter
#если список имён файлов в каталоге не пуст продолжаем работу
if ($filenames -ne $null)
{
#перебираем все имена файлов в каталоге
foreach($filename in $filenames)
{
$substr = $filename.Split("_");
$folder = $substr[0]
$year = $substr[2]
$month = $substr[3]
$curent_dir = $backup_dir
if ($folder -ne $null)
{
$curent_dir = $curent_dir + $folder+ '\'
if ($year -ne $null)
{
$curent_dir = $curent_dir + $year + '\'
if ($month -ne $null)
{
$curent_dir = $curent_dir + $month + '\'
}
}
}
# start-process -Wait $arhivator (" a " + ($curent_dir + $filename + ".zip" ) + " " + ($source_dir + $dir + '\' + $filename))
$cmd = "a " + ($curent_dir + $filename + ".zip" ) + " " + ($source_dir + $dir + '\' + $filename)
$pi = New-Object Diagnostics.ProcessStartInfo -Property @{
FileName = $arhivator
Arguments = $cmd
}
$pr = [Diagnostics.Process]::Start($pi)
$pr.WaitForExit()
#удаляем файл если создан его архив
if (get-item ($curent_dir + $filename + ".zip") | where-object {$_.exists})
{
#и код возврата равен 0
if ($pr.ExitCode -eq 0)
{
#удаляем исходный файл
Remove-Item ($source_dir + $dir + '\' + $filename)
}
else
{
#удаляем созданный архив
Remove-Item ($curent_dir + $filename + ".zip")
}
}
} #end foreach($filename in $filenames)
}#end if ($filenames -ne $null)
}#end foreach($dir in $source_dirs)
|
Время: 18:56.
© OSzone.net 2001-