代码之家  ›  专栏  ›  技术社区  ›  Wajo357

wshShell和WMIC在批量工作吗?

  •  3
  • Wajo357  · 技术社区  · 8 年前

    我试图使用这里找到的方法为批处理文件创建一个可滚动列表: Scrollable Lists in .bat Files 归功于 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}");
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   JosefZ    8 年前

    SendKeys Method 发送一个或多个击键 到活动窗口 不幸地 Sendkeys() 有时失败,通常是由于 时机 ,既麻烦又难以解决问题。我试过了 pause timeout WshShell.AppActivate

    最后,我找到了罪犯在清理以前 doskey 历史通过 doskey /REINSTALL 命令:它将安装 多斯基 .我可以推荐更直观(侵入性更小)的方法来清除 多斯基 命令历史缓冲区:

    doskey /ListSize=0
    doskey /ListSize=50
    

    奖金 :用于循环说明。

    • 外面的 %%A 循环以检索 name 所有物
    • 内部的 %%a 回车 wmic 行为:每个输出行以 0x0D0D0A ( <CR><CR><LF> )而不是普通的 0x0D0A ( <CR><LF> ).

    信用:戴夫·本汉姆 WMIC and FOR /F : A fix for the trailing <CR> problem

    工作脚本 (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}");
    }