PDA

Показать полную графическую версию : [решено] Exit Codes при запуске 7z.exe


Tonny_Bennet
18-09-2012, 12:25
Здравствуйте.

Пишу скрипт архивирования баз SQL. Хочется сделать, что бы при завершении работы архиватора можно было анализировать код возврата. У 7-zip (http://docs.bugaco.com/7zip/MANUAL/exit_codes.htm) их не много, и фактически меня интересует только один - "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)
}
}

}
}


Подскажите пожалуйста как реализовать проверку кодов возврата?

Kazun
18-09-2012, 12:51
Лучше использовать .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

Iska
18-09-2012, 13:13
Ключевое слово — «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
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)




© OSzone.net 2001-2012