Что нового

Влияние @SW_HIDE на результат выполнение батника

gora

Знающий
Сообщения
315
Репутация
19
Имеется батник (c.cmd) из одной строки:
Код:
"C:\Program Files\7-Zip\7z.exe" l -slt "test.7z" -pgora | Find "Method">mtd1.t || Echo Method = LZMA2 LZMA >mtd2.t
Запускаю его из скрипта командой:
Код:
$errrr = RunWait("c.cmd")

в результате создается один из файлов mtdХ.t
Запускаю командой:
Код:
$errrr = RunWait("c.cmd",@SW_HIDE)

и файлов mtdХ.tне создается.

Почему? И как скрыть окно в таком случае?

Спасибо.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
В справке написано, что флаг состояния окна - это 3-й (третий) параметр.
Так попробуй:
Код:
$errrr = RunWait("c.cmd", "", @SW_HIDE)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gora
А зачем это через батник запускать, можно напрямую через Run(), RunWait(), а файлы test.7z, mtd1.t и т.д. переменными задавать. Например окно сделать с Drag-and-drop.
*click*
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles [?]
А зачем это через батник запускать, можно напрямую через Run(), RunWait(), а файлы test.7z, mtd1.t и т.д. переменными задавать
Не получилось у меня почему-то... Такая строка:
Код:
$errrr = RunWait(@ComSpec & ' /c ' & '"' & $path7Zip & '7z.exe" l -slt "' & $ar & '" -pgora | Find "Method">mtd1.t || Echo Method = LZMA2 LZMA >mtd2.t', "", @SW_HIDE)

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gora
Я не совсем понял, как надо информацию разделить по файлам.
У меня так работает:
Код:
#include <Constants.au3>
;#include <Encoding.au3>
;#include <Array.au3>

$s7zip = @ScriptDir & '\7z.exe'
$sTest = @ScriptDir & '\Test.7z'
$sFile_1 = @ScriptDir & '\mtd1.t'
$sFile_2 = @ScriptDir & '\mtd2.t'
$sPass = 'gora'
$sLog = ''

$pid = Run(FileGetShortName($s7zip) & ' l -slt ' & FileGetShortName($sTest) & ' -p' & $sPass, '', @SW_HIDE, $STDOUT_CHILD)
If Not $pid Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
While 1
	$sLog &= StdoutRead($pid)
	If @error Then ExitLoop
	Sleep(10)
WEnd
;$sLog = _Encoding_866To1251($sLog)
;MsgBox(0, '', $sLog)
If Not $sLog Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
$aMetod = StringRegExp($sLog, '(Method.*?)\r\n', 3)
If IsArray($aMetod) Then
	;_ArrayDisplay($aMetod)
	$hFile_1 = FileOpen($sFile_1, 2)
	$hFile_2 = FileOpen($sFile_2, 2)
	For $i = 0 To UBound($aMetod) - 1
		If StringInStr($aMetod[$i], 'LZMA2:') Then
			FileWrite($hFile_2, $aMetod[$i] & @CRLF)
		Else
			FileWrite($hFile_1, $aMetod[$i] & @CRLF)
		EndIf
	Next
	FileClose($hFile_1)
	FileClose($hFile_2)
Else
	MsgBox(16, 'Error', 'Error')
EndIf
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Какой-то странный у вас синтаксис коммандной строки 7zip.
Ключ -pgora вообще в справке не нашел.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles
Я посмотрю Ваш вариант повнимательнее, может что-то для себя и извлеку...
Вообще у меня 7-Zip не находится в папке скрипта, а используется установленный в системе. Причем система может быть и х64, а пользователь может установить х86 архиватор и я не уверен, что вариант с короткими путями корректно сработает. Архив также находится в произвольном месте и я предпочитаю использовать полные пути (кстати и И. Павлов это рекомендует при работе с архиватором).madmasles [?]
как надо информацию разделить по файлам.
Вообще у меня один файл, два здесь использую для отладки и поиска ошибки. Этот файл создает архиватор всегда кроме случая запароленного архива. Пароль в примере указан произвольный и служит для подавления окна запроса пароля, если попадается запароленный архив. Если архиватор не смог создать этот файл, то создается файл-заглушка с одной строкой. Потом этот файл парсится для выяснения использованных методов сжатия в архиве и выбора соответствующего типа sfx модуля.

`p r o x y [?]
Ключ -pgora вообще в справке не нашел.

Это ключ -p после которого указан пароль. Кавычек здесь нет, т.к., пароль не содержит пробелов.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
`p r o x y [?]
Какой-то странный у вас синтаксис коммандной строки 7zip.
Ключ -pgora вообще в справке не нашел.
В чем странный? -p ключ gora пароль.
gora [?]
Вообще у меня 7-Zip не находится в папке скрипта
Это же пример, укажите свой путь.
я предпочитаю использовать полные пути (кстати и И. Павлов это рекомендует при работе с архиватором)
Я в Ответе #2 ссылку дал. Там я делал автономный анализ архивов и включал в скомпилированный скрипт 7z.exe и 7z.dll. Я использовал короткий путь к файлам-архивам.
madmasles [?]
проверил, у меня работает на Windows XP SP3-32, Windows 7-32 и Windows 7-64 без установленного 7-zip.
С полным путем будет так
Код:
$pid = Run('"' & $s7zip & '" l -slt "' & $sTest & '" -p' & $sPass, '', @SW_HIDE, $STDOUT_CHILD)

Проверил сейчас. У меня без пароля информацию выдает, только не дает разархивировать:
Код:
$pid = Run('"' & $s7zip & '" l -slt "' & $sTest & '"', '', @SW_HIDE, $STDOUT_CHILD)
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles [?]
Проверил сейчас. У меня без пароля информацию выдает, только не дает разархивировать:
При создании шифрованного архива установите галку "Шифровать имена файлов" и повторите тест с полученным, таким образом, архивом без указания пароля в ком. строке. Получили информацию из архиватора в файл?

PS
Я не зря использую Find в строке вывода, это позволяет отсеять много лишней и ненужной мне информации и сократить размер лога на порядок, а он порой может быть и очень большим...

madmasles [?]
включал в скомпилированный скрипт 7z.exe и 7z.dll

А это как? Разве AutoIT позволяет включать внутрь скомпилированного скрипта (exe файла) дополнительные файлы?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gora [?]
Разве AutoIT позволяет включать внутрь скомпилированного скрипта (exe файла) дополнительные файлы?
Сколько угодно.
Код:
#RequireAdmin ;это для семерки, в XP не надо
$sPathTo = @DesktopDir & '\7z.exe'
FileInstall('C:\Program Files\7-Zip\7z.exe', $sPathTo, 1)
Если Вы скомпилируйте этот скрипт, то в нем будет присутствовать 7z.exe и при запуске будет выкладывать его на рабочий стол.
установите галку "Шифровать имена файлов"
Не проверял, но верю :smile:
и сократить размер лога на порядок
Можно читать из консоли вывод и выводить только нужную информацию.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles
Вопрос по коду из поста 4. Как я понял, весь вывод из архиватора записывается в переменную $sLog.
Сделал большой архив (15 ГБ) и запустил батник:
Код:
7z.exe l -slt "c:\Windows_nc_110117_17-25.7z" -pgora >mtd1.t
7z.exe l -slt "c:\Windows_nc_110117_17-25.7z" -pgora | Find "Method">mtd2.t
Получил два файла: mtd1.t - 23 МБ, mtd2.t - 1,2 МБ.
В связи с этим возникает вопрос, есть ли ограничение на размер переменной? Можно ли записать в нее такие объемы информации?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
gora
я бы посоветовал скидывать инфу почаще в файл. и не будет болеть голова за переполнение, да и памяти не будет программа жрать, если лог будет возрастать.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Kaster [?]
скидывать инфу почаще в файл
Мне требуется всего одна строка в самом начале лога:
7-Zip [64] 9.20.04 alpha Copyright (c) 1999-2010 Igor Pavlov 2011-01-10

Listing archive: c:\Windows_nc_110117_17-25.7z

--
Path = c:\Windows_nc_110117_17-25.7z
Type = 7z
Method = LZMA2 LZMA PPMD BZip2 BCJ2
Solid = -
Blocks = 76255
Physical Size = 15729485642
Headers Size = 1474042
...
Но как считать только начало вывода и прервать его, я не знаю.
 

madmasles

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

$s7zip = @ScriptDir & '\7z.exe'
$sTest = @ScriptDir & '\Test_1.7z'

$sLog = ''

$pid = Run('"' & $s7zip & '" l -slt "' & $sTest & '"', '', @SW_HIDE, $STDOUT_CHILD)
If Not $pid Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
While 1
	$sLog &= StdoutRead($pid)
	If @error Then ExitLoop
	If StringInStr($sLog, 'Solid') Then ExitLoop
	Sleep(10)
WEnd
If ProcessExists($pid) Then
	ProcessClose($pid)
EndIf
If Not $sLog Then
	MsgBox(16, 'Error', 'Error')
	Exit
EndIf
$sMetod = StringRegExpReplace($sLog, '(?s).*?(Method.*?)\r\n?.*', '\1')
MsgBox(0, '', $sMetod)
Я ключ -p убрал. Если Вам он нужен, то поставьте.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Сделал немного иначе:
Код:
#include <Constants.au3>
;#include <Encoding.au3>
#include <Array.au3>

$path7Zip = 'c:\Program Files\7-Zip\'
$a7z = 'password.7z'
$sLog = ''
$Method = 'Method = LZMA2 LZMA'

$pid = Run('"' & $path7Zip & '7z.exe" l -slt "' & $a7z & '" -pgora', '', @SW_HIDE, $STDOUT_CHILD)
While 1
	$sLog &= StdoutRead($pid)
	If @error Then ExitLoop
	If StringLen($sLog) > 512 Then
		ProcessClose("7z.exe")
		$sLog = StringLeft($sLog, 512)
	EndIf
	Sleep(10)
WEnd
$array = StringSplit($sLog, @CRLF, 1)
;_ArrayDisplay($array)
For $i = 1 To $array[0]
	If StringInStr($array[$i], 'Method =') Then
		$Method = $array[$i]
		ExitLoop
	EndIf
Next
MsgBox(0, '', $Method)
exit
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles [?]
Я у себя нашел папку с длиной строки адреса в 187 символов.
Число можно и увеличить. С запароленным архивом (с шифрованными заголовками) Ваш вариант выдал :
7-Zip [64] 9.20.04 alpha Copyright (c) 1999-2010 Igor Pavlov 2011-01-10

Error: password.7z: Can not open encrypted archive. Wrong password?

Errors: 1
Что-то не сработали регулярные выражения, я в них совсем слаб...
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
madmasles
Я добавил пароль, но это не решает проблемы. Пароль изначально не определен и такой вывод архиватора - это стандартная ситуация. В этом случае в переменную $sMetod нужно записать 'Method = LZMA2 LZMA'. Т.е. в любом случае $sMetod не должна содержать того, что получается в Вашем варианте.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
если сканируется только метод, то может выводить инфу без "-slt" ? кол-во строк поубавится
 
Верх