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