2016-10-20 3 views
3

Я пытался создать прокручивать список для пакетного файла, используя метод нашел здесь: Scrollable Lists in .bat Files Кредит на https://stackoverflow.com/users/778560/aaciniwshShell и WMIC работают вместе в пакетном режиме?

Один я попытался добавить обратно в моем коде для моей очередной партии несколько строк в то время, я заметил, что решение не работает, когда я использую 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}"); 
} 
+0

Единственная причина я вижу для него, чтобы не работать при вызове 'wmic' является то, что может быть ваш командный файл называется 'wmic.bat' или' wmic.cmd', и он сам вызывает вызов. Также обратите внимание, что вам не хватает 'goto: eof' непосредственно перед строкой' @ end' –

+0

Я могу подтвердить это измененное поведение, т. Е. Меню не отображается даже с другим исполняемым файлом вместо 'wmic'. Протестировано, например. 'findstr/N" wshShell "% ~ f0' (Windows 8.1). – JosefZ

+0

@JosefZ, протестирован на Windows 10 64 и Windows 7 32.В обоих случаях опубликованный код показывает меню, но 'doskey/reinstall' не очищает историю предыдущих команд с помощью или без' wmic' –

ответ

1

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

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

doskey /ListSize=0 
doskey /ListSize=50 

Bonus: Циклы объяснения.

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

Кредит: WMIC and FOR /F: A fix for the trailing <CR> problem

Рабочий сценарий Дейва Benham в (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}"); 
} 
+0

Спасибо! Кажется, это сработало! – Wajo357

0

Я не знаю, и использовать это меню, но я знаю WMIC выхода в UTF-16LE с (знаком порядка байт) BOM Я использую Recode.exe сделать преобразование в CP1252, есть и другие инструменты. Альтернативой было бы проанализировать выход wmic с циклом for.

> WMIC csproduct GET Name >wmicout.txt 
> hexviewer.vbs wmicout.txt 

Datei : wmicout.txt 
HexOffs.:_+0_+1_+2_+3__+4_+5_+6_+7__+8_+9_+A_+B__+C_+D_+E_+F__----____----____ 
00000000: FF FE 4E 00 61 00 6D 00 65 00 20 00 20 00 20 00 ..N.a.m.e. . . . 
00000010: 20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00 . . . . . . . . 
00000020: 20 00 20 00 20 00 20 00 20 00 20 00 20 00 0D 00 . . . . . . ... 
00000030: 0A 00 50 00 72 00 6F 00 4C 00 69 00 61 00 6E 00 ..P.r.o.L.i.a.n. 
00000040: 74 00 20 00 4D 00 69 00 63 00 72 00 6F 00 53 00 t. .M.i.c.r.o.S. 
00000050: 65 00 72 00 76 00 65 00 72 00 20 00 20 00 0D 00 e.r.v.e.r. . ... 
00000060: 0A 00            .. 

> WMIC csproduct GET Name |k:\sys\recode CP1252 >wmicout2.txt 
> hexviewer.vbs wmicout2.txt 

Datei : wmicout2.txt 
HexOffs.:_+0_+1_+2_+3__+4_+5_+6_+7__+8_+9_+A_+B__+C_+D_+E_+F__----____----____ 
00000000: 4E 61 6D 65 20 20 20 20 20 20 20 20 20 20 20 20 Name 
00000010: 20 20 20 20 20 20 0D 0A 50 72 6F 4C 69 61 6E 74  ..ProLiant 
00000020: 20 4D 69 63 72 6F 53 65 72 76 65 72 20 20 0D 0A MicroServer .. 
00000030: 0D 0A            .. 
+0

Nice. Но где ответ на вопрос ОП? – JosefZ

+0

Привет @JOsefZ это ответ на (предполагаемую) проблему, очевидно, не решение, так как синтаксический анализ также не работает. – LotPings

Смежные вопросы