«Массивная переменная индекс плохо отформатирована» в AutoIt
-
27-09-2019 - |
Вопрос
Я получаю следующую ошибку в моем скрипте AUTOIT:
«Формат переменная массива плохо отформатирован».
И это брошено на эту строку: Local $allDirs[$countDirs]
Func archiveDir($dir)
; Get all the files under the current dir
$allOfDir = _FileListToArray($dir)
Local $countDirs = 0
Local $countFiles = 0
$imax = UBound($allOfDir)
For $i = 0 to $imax - 1
If StringInStr(FileGetAttrib($allOfDir[$i]),"D") Then
$countDirs = $countDirs + 1
Else
$countFiles = $countFiles + 1
EndIf
Next
Local $allDirs[$countDirs]
Local $allFiles[$countFiles]
Любые идеи?
Решение
Я предполагаю, что у вас либо нет никаких подкаталогов, ни вашего кода, чтобы найти их неправильно работать. Таким образом, ваш код пытается объявить массив 0 длиной.
Добавьте эту строку прямо перед строкой, где вы получите ошибку.
MsgBox(0, "Value of $countDirs", $countDirs)
ОБНОВИТЬ
_FileListToArray
Возвращает только имена файлов / папок, а не полный путь. Призыв к FileGetAttrib
возвращает пустую строку, потому что она не находит файл / папку. Изменить ваше If
Чтобы включить родительский путь с именем файла.
If StringInStr(FileGetAttrib($dir & "\" & $allOfDir[$i]), "D") Then
Другие советы
Запустив свой код, я получаю ошибку, только если $ countdirs или $ countfiles равен 0. Вам следует проверять это, прежде чем пытаться использовать эти значения при объявлении ваших массивов.
Кроме того, быстрое примечание, ваш цикл начиная с 0 ... в Auotit Idex of Array содержит подсчет элементов в массиве. Вы могли бы сделать это так, как это вместо этого:
For $i = 1 to $allOfDir[0]
If StringInStr(FileGetAttrib($allOfDir[$i]), "D") Then
$countDirs+=1
Else
$countFiles+=1
EndIf
Next
If ($coundDirs > 0) Then
Local $allDirs[$countDirs]
; do whatever else you need to do here.
EndIf
If ($countFiles > 0) Then
Local $allFiles[$countFiles]
; do whatever else you need to do here.
EndIf