PDA

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [25] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

TERMINAL
05-05-2008, 09:28
Помогите плз, у каждого диска (CD & DVD) присутствует свой серийный номер или порядковый номер. Его возможно как то узнать.

amel27
05-05-2008, 10:04
TERMINAL
ф-ция DriveGetSerial ()
FYI: клоны имеют одинаковый серийник

TERMINAL
05-05-2008, 12:07
amel27, спс-сделал-всё получилось, только вопрос -эти серийные номера повторяются или они уникальные?

Creat0R
05-05-2008, 12:29
amel27,
Не поможешь с RegExp?

Есть строка пути к файлу:

$Var = "c:\test\some app v3.2.6\file.db.bk"

нужно получить всё кроме расширении, т.е если строка такая как я привёл в пример, то нужно получить это: «c:\test\some app v3.2.6\file»
Но тот же результат должен быть если в строке нет вовсе расширения файла, или есть, но только одно; «c:\test\some app v3.2.6\file.db».

Как видно, в пути есть точки в версии программы, это мне и мешает решить проблему, если расширение файла не указано, то возвращается «c:\test\some app v3.2»...


$sPath = "c:\test\some app v3.2.6\file.db.bk"
$sPath = StringRegExpReplace($sPath, '\.[^.{2}]*.[^\.{2}]*$', '')

ConsoleWrite($sPath)

amel27
05-05-2008, 12:48
TERMINAL
эти серийные номера повторяются или они уникальные? »генерятся случайным образом при создании/форматировании тома, соответственно если с диска сделать образ, подправить в редакторе типа UltraISO и залить обратно на болванку серийник не изменится

Creat0R
- вообще-то "расширением" называют только то, что следует в имени после последней точки ;)
- не понял смысл фигурных скобок внутри класса []
- нужно включить в рассмотрение "\"
$sPath = "c:\test\some app v3.2.6\file"
$sPath = StringRegExpReplace($sPath, '(?:\.[^\.\\]*)+$', '')
ConsoleWrite($sPath &@CRLF)

NikLok
05-05-2008, 17:06
amel27, Цитата:
случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux »
не понял вопроса - все указанные пакеты идут в исходниках »
Смысл в том что бы перевести их либо в автоит исходник либо получить как вызываемую функцию.
Я просто этот путь не проходил потому и спрашиваю.

Creat0R
05-05-2008, 23:03
amel27, вообще-то "расширением" называют только то, что следует в имени после последней точки »
Да, но в имени файла, хотя расширение можно определяеть по количеству символов после точки (что и нужно в моём случае).

не понял смысл фигурных скобок внутри класса [] »
Дело в том, что первое расширение может содержаться только из двух символов, а второе, максимум из четырёх (я это забыл подправить в своём примере).

нужно включить в рассмотрение "\" »
Да, но проблема тут в том (это я позже понял), что даже в имени файла может быть точка, которая не относится к расширению.. пример:

$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.bk"

Т.е тут нужно убрать только «.db.bk».

Creat0R
05-05-2008, 23:36
Кажется сделал:


$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.back"
;$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.bk"
;$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db"
;$sPath = "c:\test\some app v3.2.6\file_version_1.2.0"
;$sPath = "c:\test\some app v3.2.6\file.db.back"

$sPath = StringRegExpReplace($sPath, '(?i)(.*?)\.(..)(\.|$)(.{1,4})$', '\1')
ConsoleWrite($sPath & @CRLF)

Единственное что, нужно бы ещё задать что последнее расширение может содержать от одного до четырёх символов, а не 2 или 4 как у меня в шаблоне...
Мда.. иногда полезно в справку всё же заглядывать :)

{x, y} Repeat the previous character, set or group between x and y times, inclusive.

amel27
06-05-2008, 05:03
Creat0R
расширение можно определяеть по количеству символов после точки »да все можно, только нужно предупреждать чтобы говорить об одном и том же :)
кстати, а разве версия не может состоять из 2-х цифр?.. типа: "file_version_1.2.10.db" ;)
первое расширение может содержаться только из двух символов »
я к тому, что внутри скобок [] это значит совсем другое - состав класса
Кажется сделал »угу, то же самое, но короче:
$sPath = StringRegExpReplace($sPath, '\...(\..{1,4})?$', '')
теперь то же самое, но более правильно:
$sPath = StringRegExpReplace($sPath, '\.[^.\\]{2}(\.[^.\\]{1,4})?$', '')

NikLok
Смысл в том что бы перевести их либо в автоит исходникПопробуйте убедить в необходимости порта... Одно дело когда вас не устраивает что-то конкретное, и совсем другое дело "спортивный интерес" :)
либо получить как вызываемую функциюкак вы себе ее представляете?.. какие данные должны подаваться на вход и что она должна возвращать?
Я просто этот путь не проходил потому и спрашиваю »
"путей" обычно много, а "цель" одна - вот она мне и непонятна ;)

Creat0R
06-05-2008, 07:31
amel27, разве версия не может состоять из 2-х цифр? »
Может, но если это на конце, значит это расширение файла, дальше это не моя проблема :).

внутри скобок [] это значит совсем другое - состав класса »
Я позже это понял, спасибо.

то же самое, но более правильно »
Хм, не совсем, т.е если расширения будут указаны корректно, то это работает отлично, но если к примеру строка будет заканчиваться точкой («...\file.db.»), то первое расширение не будет удалено. Вобщем я остановился на таком варианте:

$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.back"

$sPath = StringRegExpReplace($sPath, '\...(\.|$)(.{1,4}|)$', '')
ConsoleWrite($sPath & @CRLF)

Спасибо за помощь, потехоньку усовершенствуются знания в RegExp :)

amel27
06-05-2008, 07:56
если к примеру строка будет заканчиваться точкой »
ну это лечится как раз легко и без особых изменений в шаблоне ;)
$sPath = StringRegExpReplace($sPath, '\.[^.\\]{2}(\.[^.\\]{0,4})?$', '')

TERMINAL
07-05-2008, 11:07
генерятся случайным образом при создании/форматировании тома, соответственно если с диска сделать образ, подправить в редакторе типа UltraISO и залить обратно на болванку серийник не изменится »
проблема в том что он даже при подправке меняется-как выйти с такой ситуации или где увидить заранее этот серийник?!

amel27
07-05-2008, 12:39
он даже при подправке меняется »AFAIK серийник для томов на HDD/FDD можно поменять программно, но для CD/DVD все сложней и походу зависит от программ прожига... К примеру, MagicISO (http://www.magiciso.com/tutorials/miso-properties.htm) заявляет о такой фиче, но проверить самому не было случая.

TERMINAL
07-05-2008, 15:22
проблема в том что он даже при подправке меняется-как выйти с такой ситуации или где увидить заранее этот серийник?! »
Там тоже не показывает.....

Возможно ли вывести содержимое маленького текстового файла через команду MsgBox?

Creat0R
07-05-2008, 15:51
amel27, это лечится как раз легко и без особых изменений в шаблоне »
Спасибо, но теперь проблема с точками на конце второго расширения :), т.е если они как бы символы самого расширения... в общем ладно, не страшно, всё ровно это не корректное расширение файла, хотя последний вариант в моём посте (http://forum.oszone.net/thread-98914-49.html#post795812) отрубает нормально расширения ;).

TERMINAL, вывести содержимое маленького текстового файла через команду MsgBox? »

MsgBox(64, "", FileRead("File.txt"))

?
:)

EgOrus
07-05-2008, 23:16
Помомгите решить проблемму. Есть скрипт, который делает листинг файлов на всех жёстких дисках по маске и записывает результат в файл. Так вот отрабатывается он как-то странно, периодически не отрабатываются некоторые из масок и часто пишется не в той кодовой станице, хотя команда на изменение кодовой страницы добавлена. Сперва думал что вся проблемма в маленьком слипе между циклами, но при увеличении времени ситуация не меняется. Скрипт то работает нормально то нет.
Opt("ExpandEnvStrings", 1)
Opt("ExpandVarStrings", 1)

$tmpfle = @WindowsDir&'\Temp\files.tmp'
Call ("Listbase", "*.doc")
Call ("Listbase", "*.xls")
Call ("Listbase", "*.ppt")

;--- Function ------
func ListBase($ext)
;Получаем буквы имеющихся жёстких дисков
$drives = DriveGetDrive("FIXED")
If @error Then Exit
;По очереди открываем каждый жёсткий диск
For $i=1 to $drives[0]
;Получаем листинг файлов для текущего расширения на текущем диске и записываем его в файл
$dr=$drives[$i]&'\'&$ext
Run('%Comspec% /c chcp 1251 | dir "$dr$" /s /b >> $tmpfle$','',@SW_HIDE)
Sleep (500)
Next
EndFunc
Причем вот такая функций работает нормально (решил просто слегка сократить код, т.к. на мой взгляд через команду echo сделать это проще и быстрее)
;--- Func ----------------------------
func ListBase($ext)
;Получаем буквы имеющихся жёстких дисков
$drives = DriveGetDrive("FIXED")
If @error Then Exit
;Открываем файл со списком
$file = FileOpen($tmpfle, 1)
;По очереди открываем каждый жёсткий диск
For $i=1 to $drives[0]
;Получаем листинг файлов для текущего расширения на текущем диске
$dr=dir($drives[$i]&'\'&$ext)
;Заполняем файл со списком построчно из предыдущего листинга
For $k=1 To $dr[0]-1
FileWrite($file, '"' & $dr[$k] & '"' & @CRLF)
Next
$dr=0
Next
FileClose($file)
EndFunc

;Функция получения списка файлов по заданному пути для заданного расширения
Func dir($d)
$dr = Run('%Comspec% /c dir "$d$" /s /b','',0,6)
$f = ''
While not @error
$f = $f & StdoutRead($dr)
Wend
Return (StringSplit(StringReplace($f,@LF,''),@CR))
EndFunc

Creat0R
08-05-2008, 01:21
EgOrus,
Во-первых я бы не стал пользоваться «Opt("ExpandEnv/VarStrings", 1)», значительно замедляет обработку строк.

Можно перебирать сразу нужные маски...


_ListFiles('*.doc|*.xls|*.ppt', @WindowsDir & '\Temp\files.tmp')

Func _ListFiles($sMasks, $sFile)
;Получаем буквы имеющихся жёстких дисков
Local $aDrives = DriveGetDrive("FIXED")
If @error Then Exit

;Если файл не существует, пишем в него типа сигнатуру для UTF-8 :)
If Not FileExists($sFile) Then FileClose(FileOpen($sFile, 2 + 128))

Local $hFileOpen = FileOpen($sFile, 1 + 64)
Local $sDirList, $sDirMaskList

For $i = 1 To $aDrives[0]
;Получаем строку с текущим диском и всеми масками
$sDirMaskList = '"' & $aDrives[$i] & '\' & StringReplace($sMasks, '|', '" "' & $aDrives[$i] & '\') & '"'
If @extended = 0 Then $sDirMaskList = '"' & $aDrives[$i] & '\' & $sMasks & '"'

;Получаем листинг файлов для текущих расширении на текущем диске
$sDirList = _DirList($sDirMaskList)

;Заполняем файл со списком из листинга
FileWrite($hFileOpen, $sDirList)
Next

FileClose($hFileOpen)
EndFunc

Func _DirList($sPath)
Local $iStdOut = Run(@Comspec & ' /c chcp 1251 | dir ' & $sPath & ' /s /b', '', '', 6)
Local $sStdOutRead = ""

While 1
$sStdOutRead &= StdoutRead($iStdOut)
If @error Then ExitLoop
Wend

Return $sStdOutRead
EndFunc

EgOrus
08-05-2008, 09:23
Во-первых я бы не стал пользоваться «Opt("ExpandEnv/VarStrings", 1)», значительно замедляет обработку строк.спасибо не знал, по поводу возможности одновременного использовании неск. масок с командой DIR даже не подумал, за это отдельное спасибо

к сожалению я именно поэтому от варианта чтения stdout отказался, что он работает несколько дольше чем сразу листинг в файл это заметно при большом общем количестве файлов и соотв. файлов по маске - порядка 10 тысяч, кроме того это проще и меньше кода. Проблемму с кодировками также не снимает - в результирующем файле получается мешанина из 866 и 1251 кодировок (это и непонятно, видимо не всегда отрабатывается chcp, или есть какой-то ньюанс с этой командой, которого я не знаю). А UTF заголовок не влияет на то, в какой кодировке записываются данные в этот файл.
Если не использовать chcp 1251 то все идет в 866 кодировке. Но тогда придется готовый файл конвретировать в 1251, что без сторонних утилит сделать проблемматично.
В предыдущем посте я писал что скрипт работает нормально, но это не так, просто запамятовал что не использовал chcp, а конечный файл перекодировал с помощью утилиты xcode.exe
Нужно это все для того, чтобы при дальнейшей вычитке результирующего файла с помощью функции _FileReadToArray($tmpfle, $aFiles) корректно обрабатывались русские имена, для этого и нужен UTF или 1251

TERMINAL
08-05-2008, 10:28
Помогите, как и где можно узнать случайный номер имедж образа?

amel27
08-05-2008, 11:09
TERMINAL
как и где можно узнать случайный номер имедж образа? »смонтировать образ в DAEMON Tools :)


Creat0R
последний вариант в моём посте отрубает нормально расширения »в постановке задачи ты выставил требования именно к расширению, поэтому логично именно его и описывать шаблоном... кроме того, так будет проще (впоследствии) читать код RegExp

это не корректное расширение файла »ну дык потому и не включил точку в класс... я исходил из того, что точка - спецсимвол, а значит должна полностью обрабатываться регулярным выражением, при желании состав класса можно поменять, но исключение на "\" полюбому нужно оставить... возбежание сюрпризов. Кстати, хорошим стилем считается предварять группы, не используемые в подстановках, командой "?:", это ускоряет обработку... хотя и не влияет на результат.


EgOrus
без сторонних утилит сделать проблемматично »для AutoIT это не проблема, вот две UDF преобразования OEM в ANSI и обратно:Func _StringANSI2OEM($strText)
Local $buf = DllStructCreate("char["& StringLen($strText)+1 &"]")
Local $ret = DllCall("User32.dll", "int", "CharToOem", "str", $strText, "ptr", DllStructGetPtr($buf))
If Not(IsArray($ret)) Then Return SetError(1, 0, '') ; ошибка DLL
If $ret[0]=0 Then Return SetError(2, $ret[0], '') ; ошибка функции
Return DllStructGetData($buf, 1)
EndFunc ;==> _StringANSI2OEM

Func _StringOEM2ANSI($strText)
Local $buf = DllStructCreate("char["& StringLen($strText)+1 &"]")
Local $ret = DllCall("User32.dll", "int", "OemToChar", "str", $strText, "ptr", DllStructGetPtr($buf))
If Not(IsArray($ret)) Then Return SetError(1, 0, '') ; ошибка DLL
If $ret[0]=0 Then Return SetError(2, $ret[0], '') ; ошибка функции
Return DllStructGetData($buf, 1)
EndFunc ;==> _StringOEM2ANSI




© OSzone.net 2001-2012