Используйте WScript.Sleep() или замену в mshta.exe однострочником

Я хочу использовать функцию WScript.Sleep() с однострочником mshta.exe из пакета (я не хочу записывать временные файлы), но получаю ошибку WScript undefined.

Как указано в этом ответе:

WScript — это объект, предоставляемый хостами W|CScript.exe; IExplorer или MSHTA не предоставляют его (см. здесь).

В режиме сна для сценариев HTA:

  • Ответ Стивена Куана использует window.setTimeOut и window.ResizeTo, которые просто вызывали ошибки (но, возможно, есть способ сделать это, чего я не знаю найти).
  • uk2015 — это VBScript.
  • iRon's: ошибка в символе 5 ';' ожидал; также select имеет одинарные кавычки (в mshta параметр заключен в двойные кавычки, и вы можете использовать одинарные кавычки внутри, но это, так сказать, третий уровень цитирования. Кроме того, вам нужны права администратора .
  • TorATB: использует пинг! Та же проблема и с кавычками.

Я не знаю, как сделать один ответ на эту работу или, если возможно.

Внутри .js, запускаемого c/wscript, все работает отлично. Есть ли замена или способ сослаться на эту функцию для mshta.exe?

Пример:

Сохраните следующий код как .js и запустите его.

new ActiveXObject('Internet.HHCtrl').TextPopup('Warning message', 'Tahoma, 16, , BOLD', 8, 4, 0x0000FF, 0x00FFFF );WScript.Sleep(5000);

Но, как я уже сказал, я хочу запустить его из партии без каких-либо временных .js (или .vbs). Попробуйте запустить этот код из командной строки:

mshta "javascript:new ActiveXObject('Internet.HHCtrl').TextPopup('Warning message', 'Tahoma, 16, , BOLD', 8, 4, 0x0000FF, 0x00FFFF );close()"

Текстовое всплывающее окно открывается и сразу же закрывается, но иногда вы можете его увидеть. Как вам удается удерживать текст в течение заданного промежутка времени, когда вы запускаете этот код с помощью mshta?


person cdlvcdlv    schedule 29.06.2018    source источник
comment
Я нашел этот вопрос, но относится к файлам .hta, и я не понимаю, как ответы (которые создают функции sleep) могут быть адаптированы к командам mshta "javascript: ...;close()" (на самом деле одна из них .vbs). Добавляю об этом в вопрос.   -  person cdlvcdlv    schedule 29.06.2018
comment
mshta vbscript:Close(Execute("CreateObject(""WScript.Shell"").Run ""ping.exe 100.64.1.1 -n 1 -w 2000"",0,True")) Попробуйте это, но Защитник Windows блокирует это.   -  person langstrom    schedule 29.06.2018
comment
Он использует метод ping, но 100.64.1.1 находится в зарезервированном пространстве, которое никогда не должно пинговаться (в отличие от 1.1.1.1, который был распространен раньше). Параметр -w указывается в миллисекундах.   -  person langstrom    schedule 29.06.2018
comment
@langstrom Хорошо. Но у вас vbscript. В любом случае, разве это не будет работать ping асинхронно, и код немедленно возобновится? И у меня есть опасения, вообще, с использованием пинга для создания задержки, потому что есть несколько сценариев, когда он выйдет из строя и быстро вернется из пингов: если у вас нет сетевой карты (редкость в наше время, я знаю) или если он отключен по какой-либо причине во время проверки связи (что не так уж маловероятно), или даже если вы были подключены к Wi-Fi, но затем он снова подключается (определенно возможно). Я думаю, что использование 0.0.0.0 или 127.0.0.1 более безопасно, но даже в этом случае...   -  person cdlvcdlv    schedule 03.07.2018
comment
@cdlvcdlv Можете ли вы поделиться своим пакетным кодом?   -  person Hackoo    schedule 03.07.2018
comment
@Хаку хорошо. Это действительно очень простая команда. Добавляю к вопросу. Я этого не делал до сих пор, потому что пытался сделать вопрос максимально полезным.   -  person cdlvcdlv    schedule 04.07.2018


Ответы (4)


Вот полный пример, показывающий, как сделать сон с помощью HTA.

<html>
<head>
<HTA:APPLICATION 
APPLICATIONNAME="Volume + - ON/OFF" 
BORDER="THIN" 
BORDERSTYLE="NORMAL" 
ICON="SndVol.exe" 
INNERBORDER="NO" 
MAXIMIZEBUTTON="NO" 
MINIMIZEBUTTON="NO" 
SCROLL="NO" 
SELECTION="NO" 
SINGLEINSTANCE="YES"/>
<title>Volume + - ON/OFF </title>
<script language="vbscript">
'************************************************************************************
Sub window_onload()
    CenterWindow 250,150
End Sub
'************************************************************************************
Sub Sleep(MSecs)' Function to pause because wscript.sleep does not work with HTA 
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim tempFolder : Set tempFolder = fso.GetSpecialFolder(2)
    Dim tempName : tempName = "Sleeper.vbs"
    If Not Fso.FileExists(tempFolder&"\"&tempName) Then
        Set objOutputFile = fso.CreateTextFile(tempFolder&"\"&tempName, True)
        objOutputFile.Write "wscript.sleep WScript.Arguments(0)"
        objOutputFile.Close
    End If
    CreateObject("WScript.Shell").Run tempFolder&"\"&tempName &" "& MSecs,1,True
End Sub
'************************************************************************************
Sub Volume(Param)
    set oShell = CreateObject("WScript.Shell") 
    Select Case Param 
    Case "MAX"
        oShell.run "%SystemRoot%\System32\SndVol.exe" 'Runs The Master Volume App.
        Sleep 2000 'Waits For The Program To Open
        oShell.SendKeys("{HOME}")' volume maximum 100%
        Sleep 100
        oShell.SendKeys"%{F4}"  ' ALT + F4
    Case "MIN"
        oShell.run "%SystemRoot%\System32\SndVol.exe" 'Runs The Master Volume App.
        Sleep 2000 'Waits For The Program To Open
        oShell.SendKeys("{END}") 'volume minimum 0% 
        Sleep 1000
        oShell.SendKeys"%{F4}"  ' ALT + F4
    Case "UP"
        oShell.run "%SystemRoot%\System32\SndVol.exe" 'Runs The Master Volume App.
        Sleep 2000 'Waits For The Program To Open
        oShell.SendKeys("{PGUP}") 'volume +20%
        Sleep 1000
        oShell.SendKeys"%{F4}"  ' ALT + F4
    Case "DOWN"
        oShell.run "%SystemRoot%\System32\SndVol.exe" 'Runs The Master Volume App.
        Sleep 2000 'Waits For The Program To Open
        oShell.SendKeys("{PGDN}") 'Turns Up The Volume 20, If It Is Muted Then It Will Unmute It
        Sleep 1000
        oShell.SendKeys"%{F4}"  ' ALT + F4
    Case "MUTE"
        oShell.run "%SystemRoot%\System32\SndVol.exe" 'Runs The Master Volume App.
        Sleep 1000 'Waits For The Program To Open
        oShell.SendKeys(" " & chr(173)) 'permet de couper/remettre le son (bascule)
        Sleep 1000
        oShell.SendKeys"%{F4}"  ' ALT + F4
    End select
End Sub
'*************************************************************************************
Sub CenterWindow(x,y)
    Dim iLeft,itop
    window.resizeTo x,y
    iLeft = window.screen.availWidth/2 - x/2
    itop = window.screen.availHeight/2 - y/2
    window.moveTo ileft,itop
End Sub
'************************************************************************************
</script>
</head>
<body>
<center>
<BUTTON style="background: Red; color: white;" onClick="Call Volume('MAX')" style="WIDTH: 85px; HEIGHT: 30px">Volume MAX</BUTTON>&nbsp;&nbsp;
<BUTTON style="background: Blue; color: white;" onClick="Call Volume('MIN')" style="WIDTH: 85px; HEIGHT: 30px">Volume MIN</BUTTON>&nbsp;&nbsp;
<BUTTON style="background: Green; color: white;" onClick="Call Volume('UP')" style="WIDTH: 85px; HEIGHT: 30px">Volume +20%</BUTTON>&nbsp;&nbsp;
<BUTTON style="background: Orange; color: white;" onClick="Call Volume('DOWN')" style="WIDTH: 85px; HEIGHT: 30px">Volume -20%</BUTTON>&nbsp;&nbsp;
<BUTTON style="background: DarkOrange; color: white;" onClick="Call Volume('MUTE')" style="WIDTH: 85px; HEIGHT: 30px">ON/OFF</BUTTON>&nbsp;&nbsp;
</center>
</body>
</html>
person Hackoo    schedule 04.07.2018
comment
А этот код можно запустить из мшты однострочником? На самом деле функция представляет собой временный .vbs файл, который вы запускаете каждый раз. - person cdlvcdlv; 04.07.2018

Основываясь на вашем вопросе редактирования, вы можете сделать что-то подобное с пакетным файлом:

@echo off
Title Execute a .JS and .VBS file in a batch script
echo Hello World !
Set "JS_Warning=%Temp%\Warning.js"
Set "VBS_Msg=%Temp%\Msg.vbs"
REM Create a .js temporary file
echo new ActiveXObject('Internet.HHCtrl'^).TextPopup('Warning message', 'Tahoma, 16, , BOLD', 8, 4, 0x0000FF, 0x00FFFF ^);WScript.Sleep(5000^);>"%JS_Warning%"
REM Create a .vbs temporary file
echo CreateObject("Internet.HHCtrl"^).TextPopup "Hello !" ^& vbCrLf ^& "How are you ?", "Verdana,8", 6, 6, 6, 6 : WScript.Sleep 5000>"%VBS_Msg%"
REM We execute the .js file
Wscript "%JS_Warning%"
REM We execute the .vbs file
Wscript "%VBS_Msg%"
person Hackoo    schedule 04.07.2018
comment
Пожалуйста, прочтите мой вопрос: Я не хочу записывать временные файлы. Есть ли замена или способ сослаться на эту функцию для mshta.exe? Понятно, что я знаю об этих возможностях. Я знаю, что вы даже можете создать гибридный сценарий, но это не то, что мне нужно. - person cdlvcdlv; 04.07.2018

Попробуйте запрос уведомления о событии WMI.
В следующем примере запроса показано, как генерировать события каждую секунду навсегда.

SELECT * FROM __InstanceModificationEvent WHERE TargetInstance ISA "Win32_LocalTime"

Вы можете использовать метод SWbemServices.ExecNotificationQuery для подписки на события.

<html>
<head>
  <title>Sleep</title>
  <HTA:APPLICATION>
</head>
<body>
<script language="javascript">
window.resizeTo(640, 480);

var CIMv2 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\CIMv2")

function sleep(count) {
    var event_gen = CIMv2.ExecNotificationQuery("SELECT * FROM __InstanceModificationEvent WHERE TargetInstance ISA \"Win32_LocalTime\"")
    for(var i = 0; i < count; i++) {
        event_gen.NextEvent();
    }
}

for(var i=0; i<3; i++) {
    sleep(3)
    alert("3 seconds passed")
}

document.write("<h1>Goodbye</h1>");
</script>
</body>
person boris9000    schedule 12.11.2018
comment
Спасибо. Я не понимаю, какой должна быть однострочник mshta, как указано в вопросе. - person cdlvcdlv; 12.11.2018

person    schedule
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Ethan; 17.07.2018