wshShell и WMIC работают вместе в пакетном режиме?

Я пытался создать прокручиваемый список для пакетного файла, используя метод, найденный здесь: прокручиваемые списки в Файлы .bat Кредит https://stackoverflow.com/users/778560/aacini

Один из них, который я попытался добавить обратно в свой код для своего обычного пакета по несколько строк за раз, заметил, что решение не работает, когда я использую WMIC. В чем причина этого и есть ли простое решение? Вы можете запустить приведенный ниже код, а затем раскомментировать строку WMIC и увидеть, что она больше не будет работать.

Изменить: я использую Windows 7

Спасибо!

@if (@CodeSection == @Batch) @then
@echo off
setlocal EnableDelayedExpansion
color F0


::FOR /F "tokens=2 delims==" %%A IN ('WMIC csproduct GET Name /VALUE ^| FIND /I "Name="') DO SET machine=%%A


Echo Reset or Continue
Set MenuOptions=RESET Continue
call :ShowMenu

pause
exit

:ShowMenu
set numOpts=0
for %%a in (%MenuOptions%) do (
   set /A numOpts+=1
   set "option[!numOpts!]=%%a"
)
rem Clear previous doskey history
doskey /REINSTALL
rem Fill doskey history with menu options
cscript //nologo /E:JScript "%~F0" EnterOpts
for /L %%i in (1,1,%numOpts%) do set /P "var="

rem Send a F7 key to open the selection menu
cscript //nologo /E:JScript "%~F0"
set /P "MenuSelected=Option Selected: "
echo/
@end
var wshShell = WScript.CreateObject("WScript.Shell"),
    envVar = wshShell.Environment("Process"),
    numOpts = parseInt(envVar("numOpts"));

if ( WScript.Arguments.Length ) {
   // Enter menu options
   for ( var i=1; i <= numOpts; i++ ) {
      wshShell.SendKeys(envVar("option["+i+"]")+"{ENTER}");
   }
} else {
   // Enter a F7 to open the menu
   wshShell.SendKeys("{F7}");
}

person Wajo357    schedule 20.10.2016    source источник
comment
Единственная причина, по которой я вижу, что он не работает при вызове wmic, заключается в том, что, возможно, ваш пакетный файл называется wmic.bat или wmic.cmd, и он вызывает сам себя. Также обратите внимание, что вам не хватает goto :eof непосредственно перед строкой @end   -  person MC ND    schedule 21.10.2016
comment
Я могу подтвердить это измененное поведение, то есть меню не появляется даже с другим исполняемым файлом вместо wmic. Протестировано, например. findstr /N "wshShell" %~f0 (Windows 8.1).   -  person JosefZ    schedule 21.10.2016
comment
@JosefZ, протестировано на Windows 10 64 и Windows 7 32. В обоих случаях опубликованный код показывает меню, но doskey /reinstall не очищает историю предыдущих команд, с wmic или без него.   -  person MC ND    schedule 21.10.2016
comment
Протестировано еще раз с некоторыми исполняемыми файлами, даже если wmic вызывает пакет из подсказки cmd. D:\bat\SO\40165693.bat не будет показывать меню, в то время как CMD /C D:\bat\SO\40165693.bat работает как шарм… @MCND Я могу подтвердить, что doskey /reinstall не очищает историю предыдущих команд (без WMIC), когда неоднократно запускает D:\bat\SO\40165693.bat на втором и после запуска.   -  person JosefZ    schedule 21.10.2016
comment
Я отредактировал пост, указав, что у меня Windows 7. Я также добавил goto:eof, который, казалось, помогал, пока я не изменил код на: FOR /F tokens=2 delims== %%A IN ('WMIC csproduct ПОЛУЧИТЬ Имя /ЗНАЧЕНИЕ ^| НАЙТИ /I Имя=') DO SET machine=%%A . Это снова не работает. Еще раз спасибо всем за помощь.   -  person Wajo357    schedule 21.10.2016


Ответы (1)


SendKeys Method отправляет одно или несколько нажатий клавиш < em>в активное окно. К сожалению, Sendkeys() иногда терпит неудачу, как правило, из-за фокусировки или времени, что вызывает затруднения и трудности в решении проблем. Я пробовал pause и timeout, пробовал WshShell.AppActivate в разных комбинациях, все безуспешно…

Наконец, я нашел виновника в очистке предыдущей истории doskey с помощью команды doskey /REINSTALL: она устанавливает новую копию doskey. Я могу порекомендовать более интуитивный (и менее инвазивный) метод очистки буфера истории команд doskey:

doskey /ListSize=0
doskey /ListSize=50

Бонус: объяснение циклов FOR.

  • внешний цикл %%A для получения свойства name;
  • внутренний цикл %%a для удаления завершающего элемента возврат каретки в возвращаемом значении: wmic поведение: каждая выходная строка заканчивается на 0x0D0D0A (<CR><CR><LF>) вместо обычного 0x0D0A (<CR><LF>).

Предоставлено: WMIC и FOR /F Дэйва Бенхэма: исправление замыкающего <CR> проблема

Рабочий скрипт (Windows 8.1 64 бит):

@if (@CodeSection == @Batch) @then
@echo OFF
setlocal EnableDelayedExpansion
REM color F0

  FOR /F "tokens=2 delims==" %%A IN ('
    WMIC csproduct GET Name /VALUE ^| FIND /I "Name="
  ') DO FOR %%a in ("%%~A") DO SET "_machine=%%~a"

Echo Reset or Continue %_machine%
Set "MenuOptions=%_machine% RESET Continue"  expanded merely for debugging purposes
call :ShowMenu

REM pause
exit /B

:ShowMenu
set numOpts=0
for %%a in (%MenuOptions%) do (
   set /A numOpts+=1
   set "option[!numOpts!]=%%a"
)
rem Clear previous doskey history
REM this causes problems: doskey /REINSTALL
doskey /ListSize=0
doskey /ListSize=50
rem Fill doskey history with menu options
cscript //nologo /E:JScript "%~F0" EnterOpts
for /L %%i in (1,1,%numOpts%) do set /P "var="

rem Send a F7 key to open the selection menu
cscript //nologo /E:JScript "%~F0"
set /P "MenuSelected=Option Selected: "
echo/
goto :eof
@end
var wshShell = WScript.CreateObject("WScript.Shell"),
    envVar = wshShell.Environment("Process"),
    numOpts = parseInt(envVar("numOpts"));

if ( WScript.Arguments.Length ) {
   // Enter menu options
   for ( var i=1; i <= numOpts; i++ ) {
      wshShell.SendKeys(envVar("option["+i+"]")+"{ENTER}");
   }
} else {
   // Enter a F7 to open the menu
   wshShell.SendKeys("{F7}");
}
person JosefZ    schedule 23.10.2016