Что нового

как указать чтобы после операции Rar.exe не закрывал свою консоль?

eil

Чайник
Сообщения
53
Репутация
0
раньше использовался bat и там просто указывалась второй строкой pause, а как задержать окно консоли используя rar через autoit? желательно с использованием ShellExecuteWait.
по поиску я встречал примеры с использованием Run() с @ComSpec /c, но толи rar не дружит с таким форматом команды, толи как всегда я чегото недопонял. :-\
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 107
Репутация
2 318
Код:
RunWait(@ComSpec & ' /C Rar.exe & Pause')

?
:think:
 
АТ
E

eil

Чайник
Сообщения
53
Репутация
0
да, это работает. но это совсем не тоже(нужно печатать exit) что pause(нажам пробел и всё). в итоге:
Код:
$check = ShellExecuteWait(@TempDir & "\rar.exe", "u -s -ac -m3 -ep1 profile.rar " & $param, "", "", @SW_SHOW)

превратилось в
Код:
$check = RunWait(@ComSpec &" /C " &@TempDir & "\rar.exe u -s -ac -m3 -ep1 profile.rar " & $param, "", @SW_SHOW)

а оно в свою очередь, в попытке сделать закрытие удобным, в
Код:
$check = Run(@ComSpec &" /C " &@TempDir & "\rar.exe u -s -ac -m3 -ep1 profile.rar " & $param, "", @SW_SHOW)
...
Send("exit",1)

и вот на месте ... были попытки дать понять send когда же передавать этот exit :wacko:

но даже это всё оказалось не главной проблемой = в последствии $check должна была отправлять на проверку успешности выполнения, а после всех этих изменений передаются не rar exit code, а нечто неизвестное(хоть и тоже числовое).в принципе это естесственно- ведь на запуск идет cmd, а не rar :-\

иными словами, мне кажется это неудобным решением..
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 318
eil,
А может лучше запускать rar.exe в скрытом режиме и читать, что он в консоли пишет.
 
АТ
E

eil

Чайник
Сообщения
53
Репутация
0
madmasles,
немного не понял предложения.. запускать какой из команд, и как тогда читать консоль если в скрытом режиме? или имеется в виду добавить операций для получения информации из консоли и вывода в скрипте -но тогда, думается, это еще длинее выходит.
 

Zaramot

I ♥ AutoIt
Сообщения
1 160
Репутация
656
А если с помощью AutoIt создать bat-файл и запустить его, а после окончания - удалить его ?
Примерно так:
Код:
;Код BAT файла
$Code = 'Start ' & FileGetShortName(@TempDir & "\rar.exe") & " u -s -ac -m3 -ep1 profile.rar " & $param & @CRLF & 'Pause'
;Полный адрес BAT файла
$Bat = @TempDir & '\test.bat'
;Записываем код в BAT файл
FileWrite($Bat, $Code)
;Запускаем с ожиданием
ShellExecuteWait($Bat)
;Удаляем BAT файл
FileDelete($Bat)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 318
eil [?]
немного не понял предложения.
Примерно так, у меня работает:
Код:
#include <Constants.au3>

$sRead = ''
$sPersent = ''
$sPersentOld = ''
$sFile = @ScriptDir & '\Test.avi'
$sRarName = StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')
$sRar = @ScriptDir & '\Rar.exe'
If StringInStr($sFile, Chr(32)) Then
	$sFile_1 = '"' & $sFile & '"'
Else
	$sFile_1 = $sFile
EndIf
If StringInStr($sRar, Chr(32)) Then $sRar = '"' & $sRar & '"'

$iPid = Run($sRar & ' a ' & $sRarName & ' ' & $sFile_1, '', @SW_HIDE, $STDOUT_CHILD)
If Not $iPid Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
ProgressOn('Архивация', StringRegExpReplace($sFile, '^.*\\', ''), '0%' & @TAB & _GetSize(0), 50, 50, 16)
While 1
	$sRead &= StdoutRead($iPid)
	If @error Then ExitLoop
	$sPersent = StringRegExpReplace($sRead, '(?s).*?(\d{1,3})%$', '$1')
	If @extended = 1 Then
		If $sPersentOld <> $sPersent Then
			$sPersentOld = $sPersent
			ConsoleWrite($sPersentOld & '%' & @LF)
			ProgressSet(Number($sPersentOld), $sPersentOld & '%' & @TAB & _GetSize(FileGetSize(@ScriptDir & '\' & $sRarName & '.rar')))
		EndIf
	EndIf
	Sleep(10)
WEnd
ConsoleWrite($sRead & @LF)
If StringInStr($sRead, 'OK') Then
	ProgressSet(100, '100%' & @TAB & _GetSize(FileGetSize(@ScriptDir & '\' & $sRarName & '.rar')), 'OK')
	Sleep(3000)
	ProgressOff()
Else
	ProgressOff()
	MsgBox(16, 'Error', 'Error')
EndIf

Func _GetSize($i_Size, $i_Float = 2, $i_Lang = 0)
	Local $a_Letters[4][2] = [['б', 'b'],['кб', 'kb'],['Мб', 'Mb'],['Гб', 'Gb']], _
			$s_Format = '%.' & $i_Float & 'f %s'

	If $i_Size < 0 Then $i_Size *= -1
	Switch $i_Size
		Case 0 To 1023
			Return StringFormat($s_Format, $i_Size, $a_Letters[0][$i_Lang])
		Case 1024 To 1048575
			Return StringFormat($s_Format, $i_Size / 1024, $a_Letters[1][$i_Lang])
		Case 1048576 To 1073741823
			Return StringFormat($s_Format, $i_Size / (1024 * 1024), $a_Letters[2][$i_Lang])
		Case Else
			Return StringFormat($s_Format, $i_Size / (1024 * 1024 * 1024), $a_Letters[3][$i_Lang])
	EndSwitch
EndFunc   ;==>_GetSize
 
АТ
E

eil

Чайник
Сообщения
53
Репутация
0
Zaramot, была и такая мысль, но 1- поменьше хочется прибегать к сторонним файлам; 2- уже все реализовано через ShellExecute и сильно менять будет жуть :wacko:
madmasles, пример мощный. я бы даже сказал очень мощный(не на час разбирательства ;D).
я то думал просто какойто параметр и пару команд добавить, а оно вон во что вылилось.. :blink: а ведь уже по сути написал утилитку для бэкапа, и просто в конце подумал "а чего бы не сделать показ консоли опциональным(а не скрытым всегда)".
спасибо за предложения, буду думать.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
Код:
$Var1 = RunWait("C:\Program Files\WinRAR\Rar.exe t -p111222333  C:\Documents and Settings\user_01\Рабочий стол\file.rar")
; тест запароленного архива их командной строки с верным паролем (т.е. file.rar - архив с паролем 111222333)
MsgBox(64, "Is $Var1", $Var1)
; смотрим возврат
$Var2 = RunWait("C:\Program Files\WinRAR\Rar.exet -p344 C:\Documents and Settings\user_01\Рабочий стол\file.rar")
; тест запароленного архива их командной строки с плохим паролем
MsgBox(64, "Is $Var2", $Var2)
; смотрим возврат


Из справки WinRar

В случае успешного завершения операции RAR заканчивает работу с
нулевым (0) кодом возврата. Ненулевой код возврата означает, что
произошла какая-то ошибка. (Коды возврата можно использовать,
например, в пакетных файлах, анализируя их с помощью переменной
ERRORLEVEL.)

0 УСПЕШНОЕ Работа завершена без ошибок.
ЗАВЕРШЕНИЕ
Это к теме? Или мимо?
[br][br]Добавлено:
Сообщение автоматически объединено:

Код:
$Var1 = RunWait("C:\Program Files\WinRAR\Rar.exe t -p111222333  file.rar")
; тест запароленного архива их командной строки с верным паролем (т.е. file.rar - архив с паролем 111222333)
MsgBox(64, "Is $Var1", $Var1)
; смотрим возврат
$Var2 = RunWait("C:\Program Files\WinRAR\Rar.exe t -p344 file.rar")
; тест запароленного архива их командной строки с плохим паролем
MsgBox(64, "Is $Var2", $Var2)
; смотрим возврат

То же самое.
Только точнее.
file.rar в данном случае - в директории скрипта
Тестировал на WinRar 4.01
 
АТ
E

eil

Чайник
Сообщения
53
Репутация
0
Yuriy, ну сам факт того что winrar имеет возвратные коды, это к теме немного относится. но приведенный код, к моей ситуации, извини нет. ;)
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
281
Вот еще варианты.
Код:
RunWait(@ComSpec & " /k Rar.exe t -p111  file.rar")
; тест запароленного архива
ShellExecuteWait(@ComSpec, "/k Rar.exe t -p111  file.rar")
 
АТ
E

eil

Чайник
Сообщения
53
Репутация
0
@ComSpec, " /k "= оставляет консоль, это да. но т.к. была запущена консоль, а не rar, то нет никаких возвратных кодов -потому это не вариант.
 
Верх