Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Exit Codes при запуске 7z.exe (http://forum.oszone.net/showthread.php?t=242902)

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)
      }
    }
     
    }
}



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

Kazun 18-09-2012 12:51 1990802

Лучше использовать .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 1990807

Ключевое слово — «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.

Время: 18:56.
© OSzone.net 2001-