从同一个Windows CMD shell中运行时,DOSKEY宏中断批处理脚本提示(SET/P)

从同一个Windows CMD shell中运行时,DOSKEY宏中断批处理脚本提示(SET/P),windows,batch-file,cmd,doskey,Windows,Batch File,Cmd,Doskey,是的,现在是2021年,我仍然在使用cmdshell和批处理脚本来完成简单的任务。 我最近刚刚尝试通过为(每个)CMD提示符会话自动运行自己的init脚本来增强我的工作流程,其中还包括设置一组DOSKEY宏 因此,这是一个类似于其他人所做的设置。[1] 在一个新脚本出现了一个奇怪的问题之后,我开始意识到,DOSKEY宏可以使用“SET/p”命令在批处理脚本中破坏交互式提示,当从这样一个修改过的具有活动宏的shell中执行时 尝试类似的操作(在提示下输入[]之间显示的文本并按): @ECHO OF

是的,现在是2021年,我仍然在使用cmdshell和批处理脚本来完成简单的任务。 我最近刚刚尝试通过为(每个)CMD提示符会话自动运行自己的init脚本来增强我的工作流程,其中还包括设置一组DOSKEY宏

因此,这是一个类似于其他人所做的设置。[1]

在一个新脚本出现了一个奇怪的问题之后,我开始意识到,DOSKEY宏可以使用“SET/p”命令在批处理脚本中破坏交互式提示,当从这样一个修改过的具有活动宏的shell中执行时

尝试类似的操作(在提示下输入[]之间显示的文本并按):

@ECHO OFF
DOSKEY print=ECHO $*
SET /P var=Enter [print Hallo]:
ECHO var: %var%
EXIT /B 0
您将看到,prompt变量保存由DOSKEY宏(“ECHO Hallo”)创建的命令提示符。

通常情况下,DOSKEY不应该在批处理文件[2][3]中工作/可用,因为它只在交互式提示[4]下工作。 但“SET/P”似乎是一个交互式shell,所以DOSKEY将替换输入的所有内容,这些内容都以定义的宏关键字开始

嗯,这对我来说似乎是一个bug(DOSKEY现在已经30岁了,顺便说一句[6]),但我在网上找不到关于这个问题的任何信息。 所以,我在想如何解决这个问题。 由于宏无法轻松停用/删除[5],因此从任何批处理文件中修复宏会很麻烦,这会导致提示

我的init脚本也只在交互式会话中运行,所以当您直接(单独)运行批处理脚本时,这不是问题

在具有“Windows 7 Home Premium SP1”的计算机上测试

资料来源:
  • 我看不到完美的解决方案,但由于DOSKEY是“交互式Shell”的代表,最简单的解决方案也是交互式的:

    在运行任何使用提示的批处理之前,只需通过ALT+F10[2][3]手动清除所有宏。

    您还可以备份和还原当前定义的宏集,例如,如果您在会话期间添加了一些宏

    DOSKEY /macros >%TEMP%\doskey-macros.txt
    [Pressing ALT+F10]
    batch_that_does_prompts.cmd
    DOSKEY /macrofile=%TEMP%\doskey-macros.txt
    

    您可以使用另一个窗口设置
    /p
    ,没有加载doskey:

    @echo off
    FOR /F "tokens=3 delims=:" %%# in ("%~0") do goto :%%#
    
    doskey x=XXXXXXXXXXX
    
    echo Test1: Shows the problem
    call :subTest
    
    echo Test2: No problem
    start "" /wait cmd /c %~d0\:subTest:\..\%~pnx0 pause
    echo end
    exit /b
    
    :subTest
    set "var=empty"
    set /p var=[Please enter a single 'x' and press enter]:
    set var
    %~1
    exit /b
    
    或者“卸载”所有宏

    @echo off
    doskey x=XXXXXXXXXXX
    
    echo Test1: Shows the problem
    call :subTest
    
    echo Test2: No problem
    REM Save macros
    DOSKEY /macros >%TEMP%\doskey-macros.txt
    call :unload_macros
    call :subTest
    
    REM Restore macros
    DOSKEY /macrofile=%TEMP%\doskey-macros.txt
    
    echo end
    exit /b
    
    :unload_macros
    for /F "delims==" %%M in ('doskey /macros') do (
        doskey %%M=
    )
    exit /b
    

    我无法通过批处理文件或命令行复制您所述的输出。好的,您是在什么Windows版本上测试的,您是否准确地键入了“print Hello”,没有前导空格等。?我自己还没有用Win10测试过它。在较新的Windows版本中,这可能是一个固定问题!您还可以通过测试DOSKEY快捷方式来浏览历史记录(如F7或F8),来测试DOSKEY在“设置/P”提示期间是否处于活动状态。我在Windows版本10.0.18363.657上进行了测试。我现在明白您的意思了。当宏被用作提示sting的一部分时,问题不会出现,而当它被作为提示输入输入时,我认为这在问题中可以用更清楚的措辞。感谢您分享这些可能的解决方法,尽管在这里可以清楚地看到从批处理文件中规避问题是多么复杂,正如我所说。所以我实际上不喜欢这些解决问题的方法。第二个方案至少是更有利的方案。