Ключ отправки VBScript "

У меня есть VBScript для отмены подписки на все объекты Steam Workshop

Код:

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate "Steam Community :: [GER] Aaron :: Abonnierte Objekte - Opera"
WshShell.AppActivate "Steam Community :: [GER] Aaron :: Abonnierte Objekte - Opera"
WshShell.AppActivate "Steam Community :: [GER] Aaron :: Abonnierte Objekte - Opera"
WshShell.SendKeys "^{2}"
WScript.Sleep 5000
WshShell.SendKeys "jQuery ("[id^='UnsubscribeItemBtn']").children().trigger('click'); setTimeout(function(){location.reload();},500);"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 5000
WshShell.SendKeys "jQuery ("[id^='UnsubscribeItemBtn']").children().trigger('click'); setTimeout(function(){location.reload();},500);"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 5000
WshShell.SendKeys "jQuery ("[id^='UnsubscribeItemBtn']").children().trigger('click'); setTimeout(function(){location.reload();},500);"
WshShell.SendKeys "{ENTER}"

И в строке 7 (символ 29) он должен отправить ", но скрипт считает, что он должен закончить команду SendKey-Command...

Как я могу предотвратить это?


person Aaron B    schedule 12.01.2017    source источник
comment
Возможный дубликат добавление кавычек в строку в VBScript   -  person scrappedcola    schedule 12.01.2017


Ответы (2)


Проблема здесь двоякая;

  1. Строки неправильно экранированы, так как @Scott имеет указал (Revision 1), но последнее изменение это не способ исправить, что "" и Chr(34) эквивалентны, и лично я бы придерживался экранирования, удваивая кавычки.

  2. Недопустимая процедура или аргумент в строке 7, символ 1 (код: 800a0005)

    вероятно, вызвано SendKeys(), когда AppActivate() не установлено правильное окно.

    Обратите внимание, что происходит в VBSEdit во время выполнения скрипта: SendKeys() внедряется в скрипт, вызывая ошибку времени выполнения.

    Скриншот

    Чтобы проверить это, нужно вернуть логическое значение из AppActivate() перед продолжением сценария, чтобы убедиться, что он выполнен успешно.

    Option Explicit
    Dim WshShell: Set WshShell = WScript.CreateObject("WScript.Shell")
    Dim IsWindowActive: IsWindowActive = WshShell.AppActivate("Steam Community :: [GER] Aaron :: Abonnierte Objekte - Opera")
    If IsWindowActive Then
        WshShell.SendKeys "^{2}"
        WScript.Sleep 5000
        WshShell.SendKeys "jQuery (""[id^='UnsubscribeItemBtn']"").children().trigger('click'); setTimeout(function(){location.reload();},500);"
        WshShell.SendKeys "{ENTER}"
        WScript.Sleep 5000
        WshShell.SendKeys "jQuery (""[id^='UnsubscribeItemBtn']"").children().trigger('click'); setTimeout(function(){location.reload();},500);"
        WshShell.SendKeys "{ENTER}"
        WScript.Sleep 5000
        WshShell.SendKeys "jQuery (""[id^='UnsubscribeItemBtn']"").children().trigger('click'); setTimeout(function(){location.reload();},500);"
        WshShell.SendKeys "{ENTER}"
    Else
        WScript.Echo "Activating Window Failed"
    End If
    

    Вывод (потому что у меня нет этого окна):

    Activating Window Failed
    


    Почему AppActivate() возвращает False?

    Что касается выяснения, почему AppActivate() возвращает False, я бы рекомендовал просмотреть

    О: WshShell.AppActivate не работает в простом скрипте vbs.

person user692942    schedule 14.01.2017
comment
Нет, все еще не работает ... я думаю, потому что я использую Windows 10? Я немного протестировал, и у меня никогда не работал app.activate... - person Aaron B; 15.01.2017
comment
@AaronB подождите, ошибки кода (проверено) или вы получите сообщение об ошибке активации окна? - person user692942; 15.01.2017
comment
@AaronB Я объяснил, почему вы получили сообщение об ошибке, которое вы разместили в ответе Скотта (так как удалено), что я почти уверен, что сделал. Теперь ваша проблема заключается в том, чтобы заставить AppActivate() возвращать True, что, вероятно, связано с WindowClass окна, см. A: WshShell.AppActivate, похоже, не работать в простом скрипте vbs. - person user692942; 15.01.2017
comment
У меня ошибка активации окна. Я посмотрел вопрос, который вы связали, и если я понял, мне просто нужно установить appactivate opera.exe? Я не про кодинг... - person Aaron B; 15.01.2017
comment
@AaronB, что я и подозревал. Вам нужно изучить этот связанный ответ, но передача имени исполняемого файла не сработает, это либо заголовок окна, но если это не сработает, идентификатор процесса (который представляет собой числовое значение, назначенное для жизни процесса) который вы можете получить, следуя подходу Bonds с использованием WMI. В любом случае, я почти уверен, что на ваш первоначальный вопрос был дан ответ, если вы найдете этот или другие ответы полезными, подумайте о том, чтобы оставить голосование, и если вопрос ответил на ваш первоначальный вопрос, рассмотрите возможность его принятия. Надеюсь, это было полезно. - person user692942; 15.01.2017

Я узнал на собственном горьком опыте, что sendkey выполняет свои «переводы» на некоторых клавишах. См. таблицу на https://social.technet.microsoft.com/wiki/contents/articles/5169.vbscript-sendkeys-method.aspx

К сожалению, я не нашел способа поставить SendKey в "сырой" режим, чтобы не интерпретировать. Поэтому мне нужно обработать строку, чтобы предварительно отменить перевод. Поскольку я использую PowerShell, я использую следующие 2 строки:

${SendKeyStr2Type} = "${Str2Type}" -replace "([\\{\\}\\[\\]\\(\\)~+^%])",'{$1}'
$wshell.SendKeys("${SendKeyStr2Type}")

Подробности: После -replace есть 2 строки, стиль регулярного выражения. В первом перечислены символы для экранирования {}[]()~+^%. Они экранируются для регулярного выражения с помощью \\. То есть в []-s получить выбор одного из них. То есть в ()-s для использования в следующей (заменяющей) строке. Вторая строка — $1, способ регулярного выражения для ввода найденной строки (здесь один символ) и ее ввода между {}-s.

Имейте в виду, sendkey отправляет key-strokes. Они позволили себе использовать некоторые символы в <shift><othercaracter>, чтобы иметь возможность набирать клавиши, которые не имеют их символов.

person CBee    schedule 05.03.2021