Войти

Показать полную графическую версию : Не срабатывает часть скрипта при его первом запуске


sNc-DAntES
18-04-2017, 13:32
Добрый день. Имеется скрипт:


#include <WinAPIEx.au3>
Opt('WinTitleMatchMode', 2)

run ( @ComSpec & " /c " & """c:\Documents and Settings\lepta\Рабочий стол\Включить Х.cmd""", "")
sleep (10000)
_WinAPI_ShellObjectProperties( "X:\" )

;Запуск свойств диска Х:\ и его расшаривание
WinWait( "[TITLE:Свойства; CLASS:#32770]", "")
ControlClick ( "[TITLE:Свойства; CLASS:#32770]", "", "[CLASS:SysTabControl32; INSTANCE:1]", "main", 1, 205,12)
ControlClick ( "[TITLE:Свойства; CLASS:#32770]", "Если, несмотря на это, вы все равно хотите открыть общий доступ к корневой папке диска, щелкните здесь", "[CLASS:SysLink; INSTANCE:4]", "main", 1, 134,54)
ControlCommand ( "[TITLE:Свойства; CLASS:#32770]", "Открыть о&бщий доступ к этой папке", "Button4", "Check", "")
ControlClick ( "[TITLE:Свойства; CLASS:#32770]", "Локальный общий доступ и безопасность", "Button6", "main", 1)
WinWaitClose ( "[TITLE:Свойства; CLASS:#32770]", "Локальный общий доступ и безопасность")

;Закрыть торрент, если он запущен
If ProcessExists ("uTorrent.exe") Then
ProcessClose ( "uTorrent.exe" )
EndIf



Проблема состоит в том, что диск ни в какую не хочет расшириваться при первом запуске скрипта. Если отключить диск и снова запустить скрипт, то всё отлично срабатывает. Подскажите, пожалуйста, в чём может быть проблема?

oz84
18-04-2017, 14:38
sNc-DAntES, а зачем вам такая свалка - и батник, и кликанье? Не проще скриптом делать то же, что делает Включить Х.cmd, а ControlClick() заменить на старую добрую net share?

Для начала заменить Run() на RunWait() не пробовали? И ждать придётся не 10 секунд, а ровно столько, сколько нужно.

Iska
18-04-2017, 21:09
заменить на старую добрую net share? »
…или использовать Wbem посредством вызова метода .Create() класса Win32_Share.

sNc-DAntES
19-04-2017, 10:57
oz84, просто я дерево и знания мои об Autoit весьма поверхностные. net share на Windows XP не имеет параметра /GRANT, то есть нельзя сделать шару только для чтения.
Не проще скриптом делать то же, что делает Включить Х.cmd »
батник делает следующее:


"c:\Program Files\Totalcmd\Utils\-=MySys=-\TrueCrypt\TrueCrypt.exe" /v d:\Lepta.tc /lx /a /p пароль /q



То есть, монтирует диск с помощью TrueCrypt. Не получилось у меня сделать это с помощью скрипта.

Для начала заменить Run() на RunWait() не пробовали? И ждать придётся не 10 секунд, а ровно столько, сколько нужно. »
Спасибо, попробую.

…или использовать Wbem посредством вызова метода .Create() класса Win32_Share. »
Это выходит далеко за границы моих знаний, к сожалению.

Iska
20-04-2017, 05:12
Это выходит далеко за границы моих знаний, к сожалению. »
Ну, попробуйте разобраться (пример на WSH): Script Create a Shared Folder and Assign Share Permissions (https://gallery.technet.microsoft.com/scriptcenter/6309d93b-fcc3-4586-b102-a71415244712). Всяко лучше, нежели эмулировать тыканье мышкой.

sNc-DAntES
20-04-2017, 10:56
Iska, то есть начать изучать другой скриптовый язык? :) Как вариант, конечно, можно, но может есть вариант с помощью Autoit? Мне кажется лучше здесь изучить вопрос чуть глубже, чем начинать учить новый язык. Буду благодарен, если посоветуете, что почитать по данному вопросу тогда?

Iska
20-04-2017, 11:41
sNc-DAntES, код из VBScript WSH практически один-в-один переводится на AutoIt. Можете попросить в Русское сообщество AutoIt (http://autoit-script.ru/), чтобы Вам перевели, или дали иной код.

sNc-DAntES
21-04-2017, 10:25
Для начала заменить Run() на RunWait() не пробовали? И ждать придётся не 10 секунд, а ровно столько, сколько нужно. »
После этого изменения, кстати, окно со свойствами диска вообще перестало появляться.

oz84
21-04-2017, 15:16
sNc-DAntES, а диск вообще монтируется после этого?
Бегло погуглил: разве нельзя просто смонтировать контейнер только на чтение? (К слову, в нагугленном было, что при использовании /v и /q параметр /a становится бесполезным, убрал.) Наверное, можно и батник написать, но раз уж в разделе AutoIt, я бы попробовал как-то так (с проверками по привычке)
#NoTrayIcon

If FileExists('X:\') Then
MsgBox(48 + 4096, 'Расшаривание X:\', 'Диск X:\ уже существует!')
Else
FileChangeDir('C:\Program Files\Totalcmd\Utils\-=MySys=-\TrueCrypt')
RunWait('TrueCrypt.exe /v D:\Lepta.tc /l x /m ro /p пароль /q', '', @SW_HIDE)
While 1
If FileExists('X:\') Then ExitLoop
Sleep(150)
WEnd
RunWait(@ComSpec & ' /C net share ShareX=X:\', '', @SW_HIDE)
MsgBox(48 + 4096, 'Расшаривание X:\', 'Вроде сработало?')
EndIf
Или вместо сообщения просто попробовать открыть, как-то так
Run('explorer.exe "\\' & @ComputerName & '\ShareX"')

P.S. FileChangeDir(), думаю, не обязательно, просто чтобы строку подсократить.

sNc-DAntES
24-04-2017, 12:31
oz84, Я вставил ваш код в SciTE, жму F5 и не происходит вообще ничего. Я делаю, что-то не так?

oz84
24-04-2017, 14:27
sNc-DAntES, наверное, требуются права админа? Попробуйте добавить второй строкой
#RequireAdmin

sNc-DAntES
24-04-2017, 15:45
наверное, требуются права админа? Попробуйте добавить второй строкой »
Да нет, я на ХР, тут с этим проще. Добавил, ничего не изменилось.

oz84
24-04-2017, 23:49
sNc-DAntES, вот в таком виде
#NoTrayIcon

Local $iCount = 0

If FileExists('X:\') Then
MsgBox(48 + 4096, 'Расшаривание X:\', 'Диск X:\ уже существует!')
Else
FileChangeDir('C:\Temp\True Crypt')
RunWait('TrueCrypt.exe /v C:\Temp\123.tc /lx /m ro /p 123 /q', '', @SW_HIDE)
While 1
If $iCount >= 10000 Then
MsgBox(48 + 4096, 'Расшаривание X:\', 'Запуск TrueCrypt почему-то не сработал!')
Exit
EndIf
If FileExists('X:\') Then ExitLoop
$iCount += 200
Sleep(200)
WEnd
RunWait(@ComSpec & ' /C net share ShareX=X:\', '', @SW_HIDE)
MsgBox(64 + 4096, 'Расшаривание X:\', 'Готово!')
EndIf

у меня срабатывает на WinXP SP3 и WinXP SP2. Диск расшаривается, изменение файлов разрешено, но т.к. монитрование в режиме только чтения - получаю отлуп.

Если запустить cmd и последовательно вставить
cd /d "'C:\Program Files\Totalcmd\Utils\-=MySys=-\TrueCrypt"
TrueCrypt.exe /v D:\Lepta.tc /lx /m ro /p пароль /q
net share ShareX=X:\

сработает?

sNc-DAntES
25-04-2017, 10:13
вот в таком виде »
Снова ничего. Если скрипт сохранить и запустить, то выдаёт ошибку в 9 строке: "Unterminated string"
сли запустить cmd и последовательно вставить »
Да, тогда диск монтируется но с полными правами. Монтировать диск в режиме чтения не вариант, т.к. иногда мне нужно давать полный доступ, а в этом случае диск придётся перемонтировать.

oz84
25-04-2017, 22:25
sNc-DAntES, покажите вашу 9ю строку из скрипта, т.к. моя определённо "terminated".

Вариант переписать на AutoIt предложеный выше VBS-скрипт или оказаться от AutoIt и добавить в него монтирование и расшаривание не рассматривали? Честно говоря, у меня опыта немного, а протокол SMB не люблю и не было необходимости разбираться и, почти, пользоваться. Возможно, всё можно попроще разрулить на уровне прав NTFS, если в контейнере используется NTFS?

sNc-DAntES
26-04-2017, 10:27
RunWait('TrueCrypt.exe "/v d:\Lepta2.pgd /lx /m ro /p 123 /q', пароль", @SW_HIDE)

Iska
26-04-2017, 10:58
sNc-DAntES, у Вас кавычки не согласованы — раз, и синтаксис функции неправильный — два.




© OSzone.net 2001-2012