Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Exit Codes при запуске 7z.exe

Ответить
Настройки темы
PowerShell - [решено] Exit Codes при запуске 7z.exe

Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 177


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте.

Пишу скрипт архивирования баз 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) 
       }
     }
      
    }
}


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

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 12:25, 18-09-2012

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Лучше использовать .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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:51, 18-09-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Ключевое слово — «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()
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:13, 18-09-2012 | #3


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 177

Профиль | Отправить PM | Цитировать


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)

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 16:04, 18-09-2012 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Exit Codes при запуске 7z.exe

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - запуск в свернутом виде (start /min, cmd /K, exit) CyberMuesli Скриптовые языки администрирования Windows 46 06-04-2019 09:50
fsck died with exit code 4 hnsk Общий по Linux 2 20-09-2010 23:08
[решено] Как после команды Run выполнить Exit Centrinar AutoIt 5 01-02-2010 21:30
[Вопрос] Видео при 1м запуске - Как поставить при каждом запуске? LEXYS Автоматическая установка Windows 2000/XP/2003 5 17-12-2009 20:08
Загрузка - При запуске жду NOD jorikello Microsoft Windows 2000/XP 4 03-08-2009 15:11




 
Переход