Что нового

Скрипт зависает при выполнении case в конструкции Switch...Case...EndSwitch

NONer

Новичок
Сообщения
27
Репутация
0
Здравствуйте!
недавно начал изучать AutoIt и в первом же скрипте застопорился:

В этом скрипте задача виснет на предпоследнем "Case $Start_Copy_Rar", не могу понять - почему...
Если поменять местами "Case $Start_Copy_Rar" и "Case $Start_Copy_Only", то будет зависать уже "Case $Start_Copy_Only".

Подскажите, пожалуйста, где ошибка?

Код:
; Подключение модулей
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

$Path_Folder_From = "c:\Post\___Script___\Test" ;Переменная - Папка "Откуда копировать"
$Folder_Input = $Path_Folder_From ; Переменная - Конечная папка "Откуда копировать", будет использоваться в дальнейшем

$Path_Winrar = "c:\Program Files\WinRAR\WinRAR.exe" ;Переменная - "Архиватор WinRAR"

$Stroka = 0 ;Переменная - Значение Y - для вывода текста в определенной строке

;Переменные - ip-адрес сервера
$Net_Filial1 = "192.168.105.1"
$Net_Filial2 = "213.180.204.11"
$Net_Filial3 = "4.4.4.4"
$Net_Filial4 = "127.0.0.1"
$Net_Filial5 = "8.8.8.8"

;Переменные - Папки "Куда копировать"
$Folder_Path_Filial1 = "d:\Post\___Script___\Test\А"
$Folder_Path_Filial2 = "d:\Post\___Script___\Test\Б"
$Folder_Path_Filial3 = "d:\Post\___Script___\Test\В"
$Folder_Path_Filial4 = "d:\Post\___Script___\Test\Г"
$Folder_Path_Filial5 = "d:\Post\___Script___\Test\Д"

$Folder_Test_Filial1 = "d:\Post\___Script___\Test\А"
$Folder_Test_Filial2 = "d:\Post\___Script___\Test\Б"
$Folder_Test_Filial3 = "d:\Post\___Script___\Test\В"
$Folder_Test_Filial4 = "d:\Post\___Script___\Test\Г"
$Folder_Test_Filial5 = "d:\Post\___Script___\Test\Д"

; Создание окна
$Main_Form = GUICreate("Копирование БД на серверы", 600, 400, -1, -1) ; Главное окно в центре экрана
GUISetIcon("C:\Windows\System32\shell32.dll", -131) ; Указание иконки окна
GUISetFont(10, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Стандартные

; Рамка "Откуда копировать"
$Border_From_Copy = GUICtrlCreateGroup("Откуда копировать", 10, 10, 580, 50)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Уменьшение

; Путь к папке "Откуда копировать"
$Stroka_Path_Input = GUICtrlCreateInput($Path_Folder_From, 16, 27, 537, 26)
GUICtrlSetState(-1, $GUI_DISABLE) ; Делаем поле "Только для чтения"
GUICtrlSetLimit(-1, 250) ; Длина строки
GUICtrlSetFont(-1, 10, 400, 0, "Verdana") ; Параметры шрифта - Стандартные

; Кнопка выбора папки
$Button_Path_From = GUICtrlCreateButton('-', 559, 27, 26, 26, $BS_ICON)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0)
GUISetState()

; Рамка "Путь к архиватору WinRAR"
$Border_WinRAR = GUICtrlCreateGroup("Путь к архиватору WinRAR", 10, 335, 580, 50)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Уменьшение

; Путь к папке Архиватор
$Path_WinRAR_Input = GUICtrlCreateInput($Path_Winrar, 16, 352, 537, 26)
GUICtrlSetState(-1, $GUI_DISABLE) ; Делаем поле "Только для чтения"
GUICtrlSetLimit(-1, 250) ; Длина строки
GUICtrlSetFont(-1, 10, 400, 0, "Verdana") ; Параметры шрифта - Стандартные

; Кнопка выбора папки
$Button_Path_WinRAR = GUICtrlCreateButton('-', 559, 352, 26, 26, $BS_ICON)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0)
GUISetState()

; Рамка "Куда копировать"
$Border_To_Copy = GUICtrlCreateGroup("Куда копировать", 10, 70, 580, 130)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Уменьшение

; Чекбокс "Сервер Филиала 1"
$Check_Filial1 = GUICtrlCreateCheckbox("Сервер Филиала 1", 20, 88, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial1 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial1 & ' )', 160, 90, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 2"
$Check_Filial2 = GUICtrlCreateCheckbox("Сервер Филиала 2", 20, 108, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial2 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial2 & ' )', 160, 110, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 3"
$Check_Filial3 = GUICtrlCreateCheckbox("Сервер Филиала 3", 20, 128, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial3 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial3 & ' )', 160, 130, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 4"
$Check_Filial4 = GUICtrlCreateCheckbox("Сервер Филиала 4", 20, 148, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial4 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial4 & ' )', 160, 150, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 5"
$Check_Filial5 = GUICtrlCreateCheckbox("Сервер Филиала 5", 20, 168, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial5 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial5 & ' )', 160, 170, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Кнопка "Упаковать и  скопировать"
$Start_Copy_Rar = GUICtrlCreateButton("Упаковать и скопировать", 10, 210, 285, 25)

; Кнопка "Только скопировать"
$Start_Copy_Only = GUICtrlCreateButton("Только скопировать", 305, 210, 285, 25)

; Рамка описания "Упаковать и скопировать"
$Border_WinRAR_And_Copy = GUICtrlCreateGroup("", 10, 240, 285, 90)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Текст описания "Упаковать и скопировать"
GUICtrlSetDefColor(0x666666) ; Меняем цвет на серый
$Text_Content_001 = GUICtrlCreateLabel('Все файлы будут упакованы в архив "Test.rar", который будет скопирован на серверы в папку:' & @CRLF & 'G:\_Обновления_\' & @YEAR & '_' & @MON & '_' & @MDAY & '\', 20, 250, 270, 75)
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Рамка описания "Только скопировать"
$Border_Only_Copy = GUICtrlCreateGroup("", 305, 240, 285, 90)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Текст описания "Только скопировать"
GUICtrlSetDefColor(0x666666) ; Меняем цвет на серый
$Text_Content_002 = GUICtrlCreateLabel('Все файлы будут просто скопированы на серверы в папку БД:' & @CRLF & 'G:\BD\', 315, 250, 270, 75)
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Параметр вывода экрана поверх всех окон
GUISetState(@SW_SHOW, $Main_Form)

While 1
	; Проверка нажатий клавиш
    $hMsg = GUIGetMsg()

	Switch $hMsg
		; Закрытие окна программы
		Case $GUI_EVENT_CLOSE
            Exit

		; Нажата кнопка выбора каталога "Откуда копировать"
		Case $Button_Path_From
            $Folder_Input = FileSelectFolder('Окуда копировать БД', $Path_Folder_From, -1, "C:\Post\BD", $Main_Form)
			; Если пользователь не нажал отмену или не закрыл окно выбора каталога, то заносим полученный путь в поле ввода
            If $Folder_Input = '' Then
			MsgBox(16, "Ошибка", "В указанной папке:  " & $Folder_Input & "  нет файлов!" & @CRLF & @CRLF & "Выберите другую папку.")
			EndIf

		; Нажата кнопка "Путь к архиватору WinRAR"
		Case $Button_Path_WinRAR
            $File_WinRAR_Input = FileOpenDialog("Укажите путь в программе WinRAR", "C:\Program Files\WinRAR", "Программы (*.exe)", 1, "WinRAR.exe")
			; Если пользователь не нажал отмену или не закрыл окно выбора каталога, то заносим полученный путь в поле ввода
            If $File_WinRAR_Input <> '' Then
				GUICtrlSetData($Path_Winrar, $File_WinRAR_Input)
			EndIf


		; Нажата кнопка "Упаковать и  скопировать"
		Case $Start_Copy_Rar

			F_Clear_Window() ; Запуск функции очистки главного окна

			; Архивирование БД
			$Stroka = $Stroka + 30 ; Значение высоты строки для вывода 1 строки текста
			GUICtrlCreateLabel("Архивирование БД ...", 20, $Stroka) ; Вывод строки о начале архивирования
			RunWait ($Path_Winrar & ' a -ep1 -ibck -inul "' & $Folder_Input & '\Test.rar" "' & $Folder_Input & '\*.*"') ; Архивирование с ожиданием завершения
			Sleep(2000) ; Пауза в 2 сек. для возможно подвисшего архиватора (у меня такое иногда бывает)
			GUICtrlCreateLabel("ОК", 190, $Stroka) ; Вывод строки о завершении архивирования

			; Копирование - Филиал 1 - если отмечено
			If GUICtrlRead($Check_Filial1) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование НСИ на сервер Филиала 1 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				$Svyaz_Filial1 = Ping ($Net_Filial1) ; Проверка пинга до сервера
				If $Svyaz_Filial1 Then ; Если сервер пингуется
					DirCreate ($Folder_Path_Filial1) ; Создание папки на сервере
					FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial1, 1) ; Копирование файла с заменой
					GUICtrlCreateLabel("ОК", 310, $Stroka) ; Вывод строки о завершении копирования
				else ; Если сервер не пингуется
					GUICtrlCreateLabel("Нет связи с сервером", 310, $Stroka) ; Вывод строки об ошибке копирования
				EndIf
			EndIf

			; Копирование - Филиал 2 - если отмечено
			If GUICtrlRead($Check_Filial2) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 2 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate ($Folder_Path_Filial2) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial2, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 315, $Stroka) ; Вывод строки о завершении копирования
			EndIf

			; Копирование - Филиала 3 - если отмечено
			If GUICtrlRead($Check_Filial3) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 3 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate ($Folder_Path_Filial3) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial3, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 310, $Stroka) ; Вывод строки о завершении копирования
			EndIf

			; Копирование - Филиал 4 - если отмечено
			If GUICtrlRead($Check_Filial4) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 4 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate ($Folder_Path_Filial4) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial4, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 312, $Stroka) ; Вывод строки о завершении копирования
			EndIf

			; Копирование - Филиал 5 - если отмечено
			If GUICtrlRead($Check_Filial5) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 5 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate ($Folder_Path_Filial5) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial5, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 317, $Stroka) ; Вывод строки о завершении копирования
			EndIf

		; Нажата кнопка "Только скопировать"
		Case $Start_Copy_Only

			F_Clear_Window() ; Запуск функции очистки главного окна

			$Stroka = $Stroka + 20 ; Переход на следующую строку
			GUICtrlCreateLabel("Копирование БД на сервер Филиала 1 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
			FileCopy($Folder_Input & "\*.*", $Folder_Test_Filial1, 1) ; Копирование файла с заменой
			GUICtrlCreateLabel("ОК", 310, $Stroka) ; Вывод строки о завершении копирования

		; Вывод всплывающего сообщения об окончании копирования
		TrayTip("Копирование БД завершено", "Не забудьте проверить индексы", 7, 1)
		MsgBox(64, "Копирование БД на серверы", "Копирование файлов завершено." & @CRLF & "Необходимо проверить индексы на указанных ранее серверах.")
		WinClose("Копирование БД на серверы", "")
	EndSwitch
WEnd

Func F_Clear_Window()
	; Удаление всех модулей в окне
	GUICtrlSetState($Border_From_Copy, $GUI_HIDE)
	GUICtrlSetState($Stroka_Path_Input, $GUI_HIDE)
	GUICtrlSetState($Button_Path_From, $GUI_HIDE)
	GUICtrlSetState($Border_WinRAR, $GUI_HIDE)
	GUICtrlSetState($Path_WinRAR_Input, $GUI_HIDE)
	GUICtrlSetState($Button_Path_WinRAR, $GUI_HIDE)
	GUICtrlSetState($Border_To_Copy, $GUI_HIDE)
	GUICtrlSetState($Check_Filial1, $GUI_HIDE)
	GUICtrlSetState($Check_Filial2, $GUI_HIDE)
	GUICtrlSetState($Check_Filial3, $GUI_HIDE)
	GUICtrlSetState($Check_Filial4, $GUI_HIDE)
	GUICtrlSetState($Check_Filial5, $GUI_HIDE)
	GUICtrlSetState($Start_Copy_Rar, $GUI_HIDE)
	GUICtrlSetState($Start_Copy_Only, $GUI_HIDE)
	GUICtrlSetState($Border_WinRAR_And_Copy, $GUI_HIDE)
	GUICtrlSetState($Text_Content_001, $GUI_HIDE)
	GUICtrlSetState($Border_Only_Copy, $GUI_HIDE)
	GUICtrlSetState($Text_Content_002, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial1, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial2, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial3, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial4, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial5, $GUI_HIDE)

	; Рамка для текста
	$Border_From_Copy = GUICtrlCreateGroup("", 10, 10, 580, 375)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
NONer [?]
недавно начал изучать AutoIt и в первом же скрипте застопорился
Забавное наблюдение :smile:. А что, обычно когда начинают изучать какой то язык программирования, ступор приходит на втором, или последующих скриптах? :ok:

В этом скрипте задача виснет на предпоследнем "Case $Start_Copy_Rar"
Что значит "виснет"? там что то делается, нужно смотреть что именно (возможно FileCopy большого количества файлов, RunWait с не завершающимся процессом, и т.д.).
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
Описание задачи:
В папке есть несколько файлов.
При нажатии на одну кнопку все файлы из папки упаковываются и копируются на несколько серверов,
при нажатии на другую кнопку все файлы просто копируются на серверы.
После окончания копирования должно появится соответствующее сообщение.

Так вот, если CASE предпоследний, то итоговое сообщение не появляется.

P.S. Тестировал на мелких файлах.


Добавлено:
Сообщение автоматически объединено:

Может быть вся структура кода неверная?
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
NONer [?]
Так вот, если CASE предпоследний, то итоговое сообщение не появляется.
Ну да. И не появится. Потому что оно прописано только в последнем Case. А после выполнения предпоследнего Case, последний перепрыгивается, выполняется EndSwitch и цикл продолжается.

Я так понял, после нажатия любой из кнопок программа должна закрываться.. Я бы вынес сообщение в отдельную функцию с выходом, типа того:
Код:
; Подключение модулей
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

$Path_Folder_From = "c:\Post\___Script___\Test" ;Переменная - Папка "Откуда копировать"
$Folder_Input = $Path_Folder_From ; Переменная - Конечная папка "Откуда копировать", будет использоваться в дальнейшем

$Path_Winrar = "c:\Program Files\WinRAR\WinRAR.exe" ;Переменная - "Архиватор WinRAR"

$Stroka = 0 ;Переменная - Значение Y - для вывода текста в определенной строке

;Переменные - ip-адрес сервера
$Net_Filial1 = "192.168.105.1"
$Net_Filial2 = "213.180.204.11"
$Net_Filial3 = "4.4.4.4"
$Net_Filial4 = "127.0.0.1"
$Net_Filial5 = "8.8.8.8"

;Переменные - Папки "Куда копировать"
$Folder_Path_Filial1 = "d:\Post\___Script___\Test\А"
$Folder_Path_Filial2 = "d:\Post\___Script___\Test\Б"
$Folder_Path_Filial3 = "d:\Post\___Script___\Test\В"
$Folder_Path_Filial4 = "d:\Post\___Script___\Test\Г"
$Folder_Path_Filial5 = "d:\Post\___Script___\Test\Д"

$Folder_Test_Filial1 = "d:\Post\___Script___\Test\А"
$Folder_Test_Filial2 = "d:\Post\___Script___\Test\Б"
$Folder_Test_Filial3 = "d:\Post\___Script___\Test\В"
$Folder_Test_Filial4 = "d:\Post\___Script___\Test\Г"
$Folder_Test_Filial5 = "d:\Post\___Script___\Test\Д"

; Создание окна
$Main_Form = GUICreate("Копирование БД на серверы", 600, 400, -1, -1) ; Главное окно в центре экрана
GUISetIcon("C:\Windows\System32\shell32.dll", -131) ; Указание иконки окна
GUISetFont(10, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Стандартные

; Рамка "Откуда копировать"
$Border_From_Copy = GUICtrlCreateGroup("Откуда копировать", 10, 10, 580, 50)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Уменьшение

; Путь к папке "Откуда копировать"
$Stroka_Path_Input = GUICtrlCreateInput($Path_Folder_From, 16, 27, 537, 26)
GUICtrlSetState(-1, $GUI_DISABLE) ; Делаем поле "Только для чтения"
GUICtrlSetLimit(-1, 250) ; Длина строки
GUICtrlSetFont(-1, 10, 400, 0, "Verdana") ; Параметры шрифта - Стандартные

; Кнопка выбора папки
$Button_Path_From = GUICtrlCreateButton('-', 559, 27, 26, 26, $BS_ICON)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0)
GUISetState()

; Рамка "Путь к архиватору WinRAR"
$Border_WinRAR = GUICtrlCreateGroup("Путь к архиватору WinRAR", 10, 335, 580, 50)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Уменьшение

; Путь к папке Архиватор
$Path_WinRAR_Input = GUICtrlCreateInput($Path_Winrar, 16, 352, 537, 26)
GUICtrlSetState(-1, $GUI_DISABLE) ; Делаем поле "Только для чтения"
GUICtrlSetLimit(-1, 250) ; Длина строки
GUICtrlSetFont(-1, 10, 400, 0, "Verdana") ; Параметры шрифта - Стандартные

; Кнопка выбора папки
$Button_Path_WinRAR = GUICtrlCreateButton('-', 559, 352, 26, 26, $BS_ICON)
GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0)
GUISetState()

; Рамка "Куда копировать"
$Border_To_Copy = GUICtrlCreateGroup("Куда копировать", 10, 70, 580, 130)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif") ; Параметры шрифта - Уменьшение

; Чекбокс "Сервер Филиала 1"
$Check_Filial1 = GUICtrlCreateCheckbox("Сервер Филиала 1", 20, 88, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial1 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial1 & ' )', 160, 90, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 2"
$Check_Filial2 = GUICtrlCreateCheckbox("Сервер Филиала 2", 20, 108, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial2 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial2 & ' )', 160, 110, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 3"
$Check_Filial3 = GUICtrlCreateCheckbox("Сервер Филиала 3", 20, 128, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial3 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial3 & ' )', 160, 130, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 4"
$Check_Filial4 = GUICtrlCreateCheckbox("Сервер Филиала 4", 20, 148, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial4 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial4 & ' )', 160, 150, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Чекбокс "Сервер Филиала 5"
$Check_Filial5 = GUICtrlCreateCheckbox("Сервер Филиала 5", 20, 168, 135, 20) ; Сам чекбокс
GUICtrlSetState(-1, $GUI_CHECKED) ; Чекбок отмечен
GUICtrlSetDefColor(0x999999) ; Меняем цвет на серый
$Content_Check_Filial5 = GUICtrlCreateLabel(' ( ' & $Folder_Path_Filial5 & ' )', 160, 170, 425, 17) ; Дописываем путь назначения
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Кнопка "Упаковать и  скопировать"
$Start_Copy_Rar = GUICtrlCreateButton("Упаковать и скопировать", 10, 210, 285, 25)

; Кнопка "Только скопировать"
$Start_Copy_Only = GUICtrlCreateButton("Только скопировать", 305, 210, 285, 25)

; Рамка описания "Упаковать и скопировать"
$Border_WinRAR_And_Copy = GUICtrlCreateGroup("", 10, 240, 285, 90)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Текст описания "Упаковать и скопировать"
GUICtrlSetDefColor(0x666666) ; Меняем цвет на серый
$Text_Content_001 = GUICtrlCreateLabel('Все файлы будут упакованы в архив "Test.rar", который будет скопирован на серверы в папку:' & @CRLF & 'G:\_Обновления_\' & @YEAR & '_' & @MON & '_' & @MDAY & '\', 20, 250, 270, 75)
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Рамка описания "Только скопировать"
$Border_Only_Copy = GUICtrlCreateGroup("", 305, 240, 285, 90)
GUICtrlSetFont(-1, 9, 400, 0, "Microsoft Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Текст описания "Только скопировать"
GUICtrlSetDefColor(0x666666) ; Меняем цвет на серый
$Text_Content_002 = GUICtrlCreateLabel('Все файлы будут просто скопированы на серверы в папку БД:' & @CRLF & 'G:\BD\', 315, 250, 270, 75)
GUICtrlSetDefColor(0x000000) ; Меняем цвет на черный

; Параметр вывода экрана поверх всех окон
GUISetState(@SW_SHOW, $Main_Form)

While 1
	; Проверка нажатий клавиш
	$hMsg = GUIGetMsg()
	
	Switch $hMsg
		; Закрытие окна программы
		Case $GUI_EVENT_CLOSE
			Exit
			
			; Нажата кнопка выбора каталога "Откуда копировать"
		Case $Button_Path_From
			$Folder_Input = FileSelectFolder('Окуда копировать БД', $Path_Folder_From, -1, "C:\Post\BD", $Main_Form)
			; Если пользователь не нажал отмену или не закрыл окно выбора каталога, то заносим полученный путь в поле ввода
			If $Folder_Input = '' Then
				MsgBox(16, "Ошибка", "В указанной папке:  " & $Folder_Input & "  нет файлов!" & @CRLF & @CRLF & "Выберите другую папку.")
			EndIf
			
			; Нажата кнопка "Путь к архиватору WinRAR"
		Case $Button_Path_WinRAR
			$File_WinRAR_Input = FileOpenDialog("Укажите путь в программе WinRAR", "C:\Program Files\WinRAR", "Программы (*.exe)", 1, "WinRAR.exe")
			; Если пользователь не нажал отмену или не закрыл окно выбора каталога, то заносим полученный путь в поле ввода
			If $File_WinRAR_Input <> '' Then
				GUICtrlSetData($Path_Winrar, $File_WinRAR_Input)
			EndIf
			
			; Нажата кнопка "Упаковать и  скопировать"
		Case $Start_Copy_Rar
			
			F_Clear_Window() ; Запуск функции очистки главного окна
			
			; Архивирование БД
			$Stroka = $Stroka + 30 ; Значение высоты строки для вывода 1 строки текста
			GUICtrlCreateLabel("Архивирование БД ...", 20, $Stroka) ; Вывод строки о начале архивирования
			RunWait($Path_Winrar & ' a -ep1 -ibck -inul "' & $Folder_Input & '\Test.rar" "' & $Folder_Input & '\*.*"') ; Архивирование с ожиданием завершения
			Sleep(2000) ; Пауза в 2 сек. для возможно подвисшего архиватора (у меня такое иногда бывает)
			GUICtrlCreateLabel("ОК", 190, $Stroka) ; Вывод строки о завершении архивирования
			
			; Копирование - Филиал 1 - если отмечено
			If GUICtrlRead($Check_Filial1) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование НСИ на сервер Филиала 1 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				$Svyaz_Filial1 = Ping($Net_Filial1) ; Проверка пинга до сервера
				If $Svyaz_Filial1 Then ; Если сервер пингуется
					DirCreate($Folder_Path_Filial1) ; Создание папки на сервере
					FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial1, 1) ; Копирование файла с заменой
					GUICtrlCreateLabel("ОК", 310, $Stroka) ; Вывод строки о завершении копирования
				Else ; Если сервер не пингуется
					GUICtrlCreateLabel("Нет связи с сервером", 310, $Stroka) ; Вывод строки об ошибке копирования
				EndIf
			EndIf
			
			; Копирование - Филиал 2 - если отмечено
			If GUICtrlRead($Check_Filial2) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 2 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate($Folder_Path_Filial2) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial2, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 315, $Stroka) ; Вывод строки о завершении копирования
			EndIf
			
			; Копирование - Филиала 3 - если отмечено
			If GUICtrlRead($Check_Filial3) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 3 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate($Folder_Path_Filial3) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial3, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 310, $Stroka) ; Вывод строки о завершении копирования
			EndIf
			
			; Копирование - Филиал 4 - если отмечено
			If GUICtrlRead($Check_Filial4) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 4 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate($Folder_Path_Filial4) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial4, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 312, $Stroka) ; Вывод строки о завершении копирования
			EndIf
			
			; Копирование - Филиал 5 - если отмечено
			If GUICtrlRead($Check_Filial5) = 1 Then
				$Stroka = $Stroka + 20 ; Переход на следующую строку
				GUICtrlCreateLabel("Копирование БД на сервер Филиала 5 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
				DirCreate($Folder_Path_Filial5) ; Создание папки на сервере
				FileCopy($Folder_Input & "\Test.rar", $Folder_Path_Filial5, 1) ; Копирование файла с заменой
				GUICtrlCreateLabel("ОК", 317, $Stroka) ; Вывод строки о завершении копирования
			EndIf
			_Exit()

			; Нажата кнопка "Только скопировать"
		Case $Start_Copy_Only
			
			F_Clear_Window() ; Запуск функции очистки главного окна
			
			$Stroka = $Stroka + 20 ; Переход на следующую строку
			GUICtrlCreateLabel("Копирование БД на сервер Филиала 1 ...", 20, $Stroka) ; Вывод строки о начале копирования на сервер Филиала 1
			FileCopy($Folder_Input & "\*.*", $Folder_Test_Filial1, 1) ; Копирование файла с заменой
			GUICtrlCreateLabel("ОК", 310, $Stroka) ; Вывод строки о завершении копирования
			_Exit()
	EndSwitch
WEnd

Func _Exit()
	; Вывод всплывающего сообщения об окончании копирования
	TrayTip("Копирование БД завершено", "Не забудьте проверить индексы", 7, 1)
	MsgBox(64, "Копирование БД на серверы", "Копирование файлов завершено." & @CRLF & "Необходимо проверить индексы на указанных ранее серверах.")
	WinClose("Копирование БД на серверы", "")
	Exit
EndFunc

Func F_Clear_Window()
	; Удаление всех модулей в окне
	GUICtrlSetState($Border_From_Copy, $GUI_HIDE)
	GUICtrlSetState($Stroka_Path_Input, $GUI_HIDE)
	GUICtrlSetState($Button_Path_From, $GUI_HIDE)
	GUICtrlSetState($Border_WinRAR, $GUI_HIDE)
	GUICtrlSetState($Path_WinRAR_Input, $GUI_HIDE)
	GUICtrlSetState($Button_Path_WinRAR, $GUI_HIDE)
	GUICtrlSetState($Border_To_Copy, $GUI_HIDE)
	GUICtrlSetState($Check_Filial1, $GUI_HIDE)
	GUICtrlSetState($Check_Filial2, $GUI_HIDE)
	GUICtrlSetState($Check_Filial3, $GUI_HIDE)
	GUICtrlSetState($Check_Filial4, $GUI_HIDE)
	GUICtrlSetState($Check_Filial5, $GUI_HIDE)
	GUICtrlSetState($Start_Copy_Rar, $GUI_HIDE)
	GUICtrlSetState($Start_Copy_Only, $GUI_HIDE)
	GUICtrlSetState($Border_WinRAR_And_Copy, $GUI_HIDE)
	GUICtrlSetState($Text_Content_001, $GUI_HIDE)
	GUICtrlSetState($Border_Only_Copy, $GUI_HIDE)
	GUICtrlSetState($Text_Content_002, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial1, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial2, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial3, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial4, $GUI_HIDE)
	GUICtrlSetState($Content_Check_Filial5, $GUI_HIDE)
	
	; Рамка для текста
	$Border_From_Copy = GUICtrlCreateGroup("", 10, 10, 580, 375)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
привет
я бы к этой задаче подошел по другому.
есть один источник и несколько мест назначения. составляем двумерный массив
в котором
1. исходная папка(она одна и та же во всех индексах) = папка назначения
2.......
и так далее
для копирования использовать функции, в которых можно наблюдать прогресс копирования и вмешаться, если нужно. к примеру вот эту http://autoit-script.ru/index.php?topic=13191.0
в этой функции есть возможность передавать массив данных для копирования
для архивации использовать библиотеку 7Zip. можно наблюдать процесс архивации и пр. как пример - http://autoit-script.ru/index.php?topic=18264.0
 
Автор
N

NONer

Новичок
Сообщения
27
Репутация
0
Dm666, Спасибо большое, теперь точно понял как работает эта часть кода, все проверил - просто отлично.

joiner, когда задача будет глобальной (в планах у меня их несколько штук), то я еще к вам обращусь - подробнее узнать о "другом подходе".
Здесь же задача самая простая, выполняющая всего два действия и нагромождать ее внешними модулями не хотелось; то, что сейчас в ней реализовано - как раз то, что нужно... К тому же я хотел изучить азы AutoIt на практике. Спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
NONer [?]
когда задача будет глобальной
я не предложил глобального решения :smile:
всего лишь указал на то, как можно решить по другому простую задачу. ваш код не контролируем. в нем несколько слабых мест.
если написание контролируемого кода считается "глобальностью", то это ошибочное мнение.
человек, решивший начать программировать, должен понять, что все действия своей программы он должен держать крепко в своих руках, на сколько это возможно в конкретной задаче.
ко мне обращаться не надо. тут и без меня много подсказчиков. и весьма грамотных. да и к тому же, на форуме много примеров. бери да склеивай в нужную тебе программу :smile:
насчет азов, то изучать их лучше на более точных реализациях, чтобы потом не тратить время на отсеивание мусора
 
Верх