Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
TERMINAL
05-05-2008, 09:28
Помогите плз, у каждого диска (CD & DVD) присутствует свой серийный номер или порядковый номер. Его возможно как то узнать.
TERMINAL
ф-ция DriveGetSerial ()
FYI: клоны имеют одинаковый серийник
TERMINAL
05-05-2008, 12:07
amel27, спс-сделал-всё получилось, только вопрос -эти серийные номера повторяются или они уникальные?
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)
TERMINAL
эти серийные номера повторяются или они уникальные? »генерятся случайным образом при создании/форматировании тома, соответственно если с диска сделать образ, подправить в редакторе типа UltraISO и залить обратно на болванку серийник не изменится
Creat0R
- вообще-то "расширением" называют только то, что следует в имени после последней точки ;)
- не понял смысл фигурных скобок внутри класса []
- нужно включить в рассмотрение "\"
$sPath = "c:\test\some app v3.2.6\file"
$sPath = StringRegExpReplace($sPath, '(?:\.[^\.\\]*)+$', '')
ConsoleWrite($sPath &@CRLF)
amel27, Цитата:
случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux »
не понял вопроса - все указанные пакеты идут в исходниках »
Смысл в том что бы перевести их либо в автоит исходник либо получить как вызываемую функцию.
Я просто этот путь не проходил потому и спрашиваю.
amel27, вообще-то "расширением" называют только то, что следует в имени после последней точки »
Да, но в имени файла, хотя расширение можно определяеть по количеству символов после точки (что и нужно в моём случае).
не понял смысл фигурных скобок внутри класса [] »
Дело в том, что первое расширение может содержаться только из двух символов, а второе, максимум из четырёх (я это забыл подправить в своём примере).
нужно включить в рассмотрение "\" »
Да, но проблема тут в том (это я позже понял), что даже в имени файла может быть точка, которая не относится к расширению.. пример:
$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.bk"
Т.е тут нужно убрать только «.db.bk».
Кажется сделал:
$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.
Creat0R
расширение можно определяеть по количеству символов после точки »да все можно, только нужно предупреждать чтобы говорить об одном и том же :)
кстати, а разве версия не может состоять из 2-х цифр?.. типа: "file_version_1.2.10.db" ;)
первое расширение может содержаться только из двух символов »
я к тому, что внутри скобок [] это значит совсем другое - состав класса
Кажется сделал »угу, то же самое, но короче:
$sPath = StringRegExpReplace($sPath, '\...(\..{1,4})?$', '')
теперь то же самое, но более правильно:
$sPath = StringRegExpReplace($sPath, '\.[^.\\]{2}(\.[^.\\]{1,4})?$', '')
NikLok
Смысл в том что бы перевести их либо в автоит исходникПопробуйте убедить в необходимости порта... Одно дело когда вас не устраивает что-то конкретное, и совсем другое дело "спортивный интерес" :)
либо получить как вызываемую функциюкак вы себе ее представляете?.. какие данные должны подаваться на вход и что она должна возвращать?
Я просто этот путь не проходил потому и спрашиваю »
"путей" обычно много, а "цель" одна - вот она мне и непонятна ;)
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 :)
если к примеру строка будет заканчиваться точкой »
ну это лечится как раз легко и без особых изменений в шаблоне ;)
$sPath = StringRegExpReplace($sPath, '\.[^.\\]{2}(\.[^.\\]{0,4})?$', '')
TERMINAL
07-05-2008, 11:07
генерятся случайным образом при создании/форматировании тома, соответственно если с диска сделать образ, подправить в редакторе типа UltraISO и залить обратно на болванку серийник не изменится »
проблема в том что он даже при подправке меняется-как выйти с такой ситуации или где увидить заранее этот серийник?!
он даже при подправке меняется »AFAIK серийник для томов на HDD/FDD можно поменять программно, но для CD/DVD все сложней и походу зависит от программ прожига... К примеру, MagicISO (http://www.magiciso.com/tutorials/miso-properties.htm) заявляет о такой фиче, но проверить самому не было случая.
TERMINAL
07-05-2008, 15:22
проблема в том что он даже при подправке меняется-как выйти с такой ситуации или где увидить заранее этот серийник?! »
Там тоже не показывает.....
Возможно ли вывести содержимое маленького текстового файла через команду MsgBox?
amel27, это лечится как раз легко и без особых изменений в шаблоне »
Спасибо, но теперь проблема с точками на конце второго расширения :), т.е если они как бы символы самого расширения... в общем ладно, не страшно, всё ровно это не корректное расширение файла, хотя последний вариант в моём посте (http://forum.oszone.net/thread-98914-49.html#post795812) отрубает нормально расширения ;).
TERMINAL, вывести содержимое маленького текстового файла через команду MsgBox? »
MsgBox(64, "", FileRead("File.txt"))
?
:)
Помомгите решить проблемму. Есть скрипт, который делает листинг файлов на всех жёстких дисках по маске и записывает результат в файл. Так вот отрабатывается он как-то странно, периодически не отрабатываются некоторые из масок и часто пишется не в той кодовой станице, хотя команда на изменение кодовой страницы добавлена. Сперва думал что вся проблемма в маленьком слипе между циклами, но при увеличении времени ситуация не меняется. Скрипт то работает нормально то нет.
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
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
Во-первых я бы не стал пользоваться «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
Помогите, как и где можно узнать случайный номер имедж образа?
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.