Windows BATCH:如何禁用单个脚本的快速编辑模式?

Posted

技术标签:

【中文标题】Windows BATCH:如何禁用单个脚本的快速编辑模式?【英文标题】:Windows BATCH: How to disable QuickEdit Mode for individual scripts? 【发布时间】:2014-03-15 08:52:19 【问题描述】:

如果您希望直接从命令提示符快速突出显示和复制文本,而不是将输出重定向到文件,则快速编辑模式会很有用。但是,它也有其缺点。如果您正在运行批处理脚本,则在控制台中选择文本将暂停脚本执行,直到取消选择文本。如果脚本预计会不间断地继续,这可能是个问题。

如何禁用某些 BATCH 脚本的快速编辑模式?

【问题讨论】:

【参考方案1】:

很遗憾,无法从命令行编辑当前 CMD 控制台实例的 QuickEdit 设置。但是,我们可以暂时禁用全局 QuickEdit 设置并启动一个新的控制台实例。有几种方法可以做到这一点,每种方法都有自己的优点(优点)和缺点(缺点)。以下两种解决方案都需要能够修改注册表。

    REGEDIT

    PRO:兼容任何常见的 Windows 系统

    CON:需要创建临时 REG 文件

    代码(位于脚本的开头):

    if exist "%TEMP%\consoleSettingsBackup.reg" regedit /S "%TEMP%\consoleSettingsBackup.reg"&DEL /F /Q "%TEMP%\consoleSettingsBackup.reg"&goto :mainstart
    regedit /S /e "%TEMP%\consoleSettingsBackup.reg" "HKEY_CURRENT_USER\Console"
    echo REGEDIT4>"%TEMP%\disablequickedit.reg"
    echo [HKEY_CURRENT_USER\Console]>>"%TEMP%\disablequickedit.reg"
    (echo "QuickEdit"=dword:00000000)>>"%TEMP%\disablequickedit.reg"
    regedit /S "%TEMP%\disablequickedit.reg"
    DEL /F /Q "%TEMP%\disablequickedit.reg"
    start "" "cmd" /c "%~dpnx0"&exit
    
    :mainstart
    

    REG

    专业版:不需要创建临时文件 CON:在没有 Resource Kit 的 Windows 2000 及更早版本上不可用

    CON:不同的版本有不同的语法(在下面的代码中说明)

    代码(位于脚本的开头):

    set reg50=::&set reg51=::&(reg /?>nul 2>&1 && set reg51=)
    if %errorlevel%==5005 set reg50=
    set qkey=HKEY_CURRENT_USER\Console&set qprop=QuickEdit
    %reg51%if defined qedit_val (echo y|reg add "%qkey%" /v "%qprop%" /t REG_DWORD /d %qedit_val%&goto :mainstart)
    %reg50%if defined qedit_val (reg update "%qkey%\%qprop%"=%qedit_val%&goto :mainstart)
    %reg51%for /f "tokens=3*" %%i in ('reg query "%qkey%" /v "%qprop%" ^| FINDSTR /I "%qprop%"') DO set qedit_val=%%i
    %reg50%for /f "tokens=3*" %%i in ('reg query "%qkey%\%qprop%"') DO set qedit_val=%%i
    if "%qedit_val%"=="0" goto :mainstart
    if "%qedit_val%"=="0x0" goto :mainstart
    %reg51%echo y|reg add "%qkey%" /v "%qprop%" /t REG_DWORD /d 0
    %reg50%if "%qedit_val%"=="" reg add "%qkey%\%qprop%"=0 REG_DWORD
    %reg50%if "%qedit_val%"=="1" reg update "%qkey%\%qprop%"=0
    start "" "cmd" /c set qedit_val=%qedit_val% ^& call "%~dpnx0"&exit
    
    :mainstart
    

如果您有其他解决方案,请随时发布。

【讨论】:

我会感谢您跳出框框思考。真令人沮丧,没有更简单的方法,分发给最终用户的批处理脚本可能从一开始就“失败”,除非我们想稍微“破解”一下。【参考方案2】:

一种会影响当前命令提示符会话的方式。

这里是quickEdit.bat。它是一个自编译的 .net 脚本,因此需要安装 .net(在 Winsows XP/2003 上默认不安装)。

用法:

启用:

 quickEdit  1

禁用:

 quickEdit  2

获取状态:

 quickEdit  3

【讨论】:

这个超级好用,超级酷!编译后的 exe 是否需要 .net 框架?还是只是批处理文件需要它? @MarkDodsons - 是的 - 两者都需要 .net 框架(这只是一些 XP/Win2003 机器的问题)。.net 可执行文件 are not exactly the same 作为 win32 可执行文件。【参考方案3】:

对对我有用的选项 1 的轻微更新,在 Win10 上不会运行两次,谢谢。

if exist "c:\temp\consoleSettingsBackup.reg" regedit /S "c:\temp\consoleSettingsBackup.reg" & DEL /F /Q "c:\temp\consoleSettingsBackup.reg" & goto START
regedit /S /e "c:\temp\consoleSettingsBackup.reg" "HKEY_CURRENT_USER\Console"
reg add "HKCU\Console" /v QuickEdit /t REG_DWORD /d 0 /f
start "" "cmd" /c ""%~dpnx0" & exit"
exit

: START
rem your commands\scripts here

exit

【讨论】:

【参考方案4】:

已经回答here,更新Windows注册表中的“QuickMode”设置:

reg add HKCU\Console /v QuickEdit /t REG_DWORD /d 0 /f

但是它不会影响当前打开的窗口。但是你可以重新打开一个窗口:

:: Get QuickEdit Mode setting from Windows Registry
FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKCU\Console" /v QuickEdit`) DO (
  set quickEditSetting=%%A %%B
)

if %quickEditSetting%==0x1 (
  :: Disable QuickEdit Mode
  reg add HKCU\Console /v QuickEdit /t REG_DWORD /d 0 /f

  :: Open script in a new Command Prompt window
  start "" "%~dpnx0" %* && exit
)

... script logic here ...
exit

关于 HKEY_CURRENT_USER\Console 注册表配置的其他信息 - https://renenyffenegger.ch/notes/Windows/registry/tree/HKEY_CURRENT_USER/console/index

【讨论】:

以上是关于Windows BATCH:如何禁用单个脚本的快速编辑模式?的主要内容,如果未能解决你的问题,请参考以下文章

Windows Batch:如何添加主机条目?

需要windows的简易安装方法/批量参考?

禁用 Spring Batch 作业

CFX: 采用Perl或Windows batch运行CFX脚本文件

SQL Server:如何通过脚本同时禁用多个登录

通过(全局)shell脚本启动节点时如何禁用警告