AutoIt: Func() срабатывает, а значение переменной не передаётся

Пётр252808

Новый пользователь
Сообщения
8
Реакции
0
Доброго времени суток, форум!

Есть работающий AutoIt скрипт. Переменные $File и $FileNumber в скрипте объявлены Local сразу в начале после #include... .
Вставляю в скрипт функцию следующего содержания:
Код:
Func FileNumber()
For $FileNumber = 1 To 999 Step 1
If $FileNumber < 10 Then
$FileNumber = "00" & $FileNumber
elseif $FileNumber > 9 And $FileNumber < 100 Then
$FileNumber = "0" & $FileNumber
EndIf
$File = $LogPath & $FileNumber & "-" & "*" & ".txt"
If FileExists ($File) == 0 Then
ExitLoop
EndIf
Next
EndFunc ; FileNumber
При помощи вспомогательных вставок типа
Код:
MsgBox($MB_SYSTEMMODAL,"",$File & $FileNumber)
видно, что функция FileNumber() срабатывает и переменные $File и $FileNumber, в особенности $FileNumber, наполняются содержимым.
Далее в скрипте переменная $FileNumber встраивается в переменную
Код:
$Accessible = $LogPath & $FileNumber & "-" & $TimeForFileName & "-" & "-accessible.txt"
, которая должна представлять собой путь к файлу и имя файла, в котором $FileNumber это номер этого файла.
Так вот проблема в том, что все компоненты $Accessible срабатывают и файл создаётся, а $FileNumber
оказывается пустым, содержание $Accessible при этом таково: "C:\Folder\-accessible.txt".
Даже более того: если MsgBox вставить в скрипте прямо после FileNumber(),
то сообщение MsgBox покажет пустоту(!?).

Пожалуйста, помогите разобраться, почему $FileNumber оказывается пустым.
 
Последнее редактирование:
Не смешивайте в кучу название переменной и название функции.
Нужно отделить мух от котлет.
А для возвращения функцией значения служит команда Return.
Также хорошим тоном является оформление логических блоков кода отступами.

Код:
#include <Constants.au3>

Local $FileNumber, $File, $LogPath, $TimeForFileName

$FileNumber = GetFileNumber()

$Accessible = $LogPath & $FileNumber & "-" & $TimeForFileName & "-" & "-accessible.txt"

MsgBox($MB_SYSTEMMODAL, "", $Accessible)

Func GetFileNumber()
    Local $FileNumber
    For $FileNumber = 1 To 999 Step 1
        If $FileNumber < 10 Then
            $FileNumber = "00" & $FileNumber
        elseif $FileNumber > 9 And $FileNumber < 100 Then
            $FileNumber = "0" & $FileNumber
        EndIf
        $File = $LogPath & $FileNumber & "-" & "*" & ".txt"
        If FileExists ($File) == 0 Then
            ExitLoop
        EndIf
    Next
    Return $FileNumber
EndFunc
 
Доброго времени, @Dragokas!
Благодарю Вас за подробный ответ.
Ниже покажу свой вариант решения, который выявил после ряда эксперименов:
Код:
Func FileNumber()
For $i3 = 1 To 999 Step 1
$FileNumber = $i3
If $FileNumber < 10 Then
$FileNumber = "00" & $FileNumber
EndIf
If $FileNumber > 9 And $FileNumber < 100 Then
$FileNumber = "0" & $FileNumber
EndIf
$File = $LogPath & $FileNumber & "-" & "*" & ".txt"
If FileExists ($File) == 0 Then
ExitLoop
EndIf
Next
EndFunc ; FileNumber
Отличие от моего исходного кода заключается только в следующем фрагменте -
добавлена переменная i3 для отсчёта цикла и ею подменена использовавшаяся ранее
как для отсчёта цикла так и для вычисления номера файла переменная $FileNumber:
Код:
For $i3 = 1 To 999 Step 1
$FileNumber = $i3n
(Прошу простить отсутствие отступов.)

Не для спора, а токмо для целей познания отмечаю, что использование Return
видимо не является необходимым и сходное название функции и переменной
видимо не вредит - "ведь работает и так", правда?
Точно также не оказалось необходимым повторное объявление переменной
внутри цикла.
 
Последнее редактирование:
видимо не является необходимым и сходное название функции и переменной
видимо не вредит - "ведь работает и так", правда?
Без понятия, у меня уровень знаний AutoIt ниже начального.
Но да, у вас получилась модификация переменной цикла внутри него же. Это недопустимо.
А работает потому, что у переменной $FileNumber область видимости выше, чем просто локальная. Оператор Local, объявленный вне функции, действует на все вложенные.
Если нужно что-то возращать функцией, то обычно это делают через Return, или изменяя передаваемую в функцию отдельным параметром переменную (по адресу).
Почему: это делает код более читаемым и менее запутанным.
И здесь такое же замечание, как и в теме по batch. Чтобы добавить лидирующие нули, не нужно что-то вычислять, можно просто добавить максимум и отсечь правую часть. Кажется, за это отвечает Function StringTrimRight
И код вы зря не форматируете отступами. С готовым кодом это делается очень легко: выделяете нужные строки, и будучи выделенными один раз (или несколько) нажимаете на кнопку TAB (или на Shift+TAB, если нужно наоборот удалить отступы).
 
Назад
Сверху Снизу