Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


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

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


Помомгите решить проблемму. Есть скрипт, который делает листинг файлов на всех жёстких дисках по маске и записывает результат в файл. Так вот отрабатывается он как-то странно, периодически не отрабатываются некоторые из масок и часто пишется не в той кодовой станице, хотя команда на изменение кодовой страницы добавлена. Сперва думал что вся проблемма в маленьком слипе между циклами, но при увеличении времени ситуация не меняется. Скрипт то работает нормально то нет.
Код: Выделить весь код
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, 07-05-2008 в 23:28.


Отправлено: 23:16, 07-05-2008 | #496