批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[文本处理] 电脑扩展屏幕到电视,如何做一键切换的BAT脚本?

仅电脑屏幕
displayswitch /internal
复制屏幕
displayswitch /clone
扩展屏幕
displayswitch /extend
仅第二屏幕
displayswitch /external


一般常用,就”仅电脑屏幕“+”扩展屏幕“这2个。
希望能实现检测当前屏幕状态,
如果是”仅电脑屏幕“状态,则切换成”扩展“;
如果是”扩展“状态,则切换成”仅电脑屏幕“。




自制脚本目前已实现,可惜没有检测功能,无法一键自动切换。多点手脚。
  1. @echo off&color 0a
  2. :nn
  3. echo.
  4. echo.
  5. echo         ——————电脑屏幕扩展——————
  6. echo.
  7. echo.
  8. echo         0  关闭扩展(仅电脑屏幕)
  9. echo.
  10. echo         +  扩展屏幕(扩展电视屏幕)
  11. echo.
  12. echo         1  复制屏幕(同步电脑屏幕)
  13. echo.
  14. echo         2  仅第二屏幕(切换到电视屏幕)
  15. echo.
  16. echo         0  退出
  17. echo.
  18. echo.
  19. echo.
  20. echo         ——直接回车  (关闭扩展)
  21. echo.
  22. echo.
  23. set /p xz="请输入序号:"
  24. if not defined xz goto :aaa
  25. if "%xz%"=="0" goto aaa
  26. if "%xz%"=="+" goto bbb
  27. if "%xz%"=="1" goto ccc
  28. if "%xz%"=="2" goto ddd
  29. echo.
  30. echo.
  31. @echo 你没有输入正确值,即将退出
  32. ping -n 2 127.0.0.1 1>nul 2>nul
  33. cls
  34. goto ttt
  35. ::仅电脑屏幕
  36. :aaa
  37. cls
  38. echo.
  39. displayswitch /internal
  40. echo 仅电脑屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
  41. ::扩展屏幕
  42. :bbb
  43. cls
  44. echo.
  45. displayswitch /extend
  46. echo 扩展屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
  47. ::复制屏幕
  48. :ccc
  49. cls
  50. echo.
  51. displayswitch /clone
  52. echo.
  53. echo 复制屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
  54. ::仅第二屏幕
  55. :ddd
  56. cls
  57. echo.
  58. displayswitch /external
  59. echo 仅第二屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
  60. :ttt
  61. exit
复制代码

本帖最后由 mzzyb 于 2023-1-14 12:00 编辑

2种解决方案,
第一种:把上面4条命令单独做成4个bat文件,你单击相应的就能实现相应的效果
第二种:做成1个bat文件,有交互,代码如下:
  1. @echo off
  2. :start
  3. set /P a=(仅电脑屏幕输入1)(复制屏幕输入2)(扩展屏幕输入3)(仅第二屏幕输入4)
  4. if "%a%"=="1" cls & goto 1
  5. if "%a%"=="2" cls & goto 2
  6. if "%a%"=="3" cls & goto 3
  7. if "%a%"=="4" cls & goto 4
  8. :1
  9. displayswitch /internal
  10. pause>nul
  11. goto start
  12. :2
  13. displayswitch /clone
  14. pause>nul
  15. goto start
  16. :3
  17. displayswitch /exten
  18. pause>nul
  19. goto start
  20. :4
  21. displayswitch /external
  22. pause>nul
  23. goto start
复制代码
刚认真看了你的需求,应该要结合一下下面的命令:
  1. color 0a
  2. title 硬件检测
  3. mode con cols=90
  4. sc config winmgmt start= auto >nul 2<&1
  5. net start winmgmt 2>1nul
  6. setlocal ENABLEDELAYEDEXPANSION
  7. set tee=0
  8. for /f "tokens=1,* delims==" %%a in ('wmic DESKTOPMONITOR get name^,ScreenWidth^,ScreenHeight^,PNPDeviceID /value') do (
  9. set /a tee+=1
  10. if "!tee!" == "3" echo 类 型 = %%b
  11. if "!tee!" == "4" echo 其他信息 = %%b
  12. if "!tee!" == "5" echo 屏幕高 = %%b
  13. if "!tee!" == "6" echo 屏幕宽 = %%b
  14. )
  15. set tee=0
  16. echo.
  17. pause
复制代码
但是bat只运行1次,所以要想办法让它一直运行检测,但是这样会小号系统资源。

TOP

我很好奇,你为什么不用快捷键win+p调出投影选项呀~~这样可能会更省事

TOP

回复 3# mzzyb


win+P,在win10中反应较慢,不太灵敏。还必须先点一下任务栏,按完快捷键还迟2~3秒才弹出选项。

TOP

2种解决方案,
第一种:把上面4条命令单独做成4个bat文件,你单击相应的就能实现相应的效果
第二种:做成 ...
mzzyb 发表于 2023-1-14 10:48


第二种运行结果如下。。。有检测屏幕状况就好了。貌似不容易实现。。。脚本运行一次就好。

D:\桌面>sc config winmgmt start= auto  1>nul 2<&1

D:\桌面>net start winmgmt  2>1nul

D:\桌面>setlocal ENABLEDELAYEDEXPANSION

D:\桌面>set tee=0

D:\桌面>for /F "tokens=1,* delims==" %a in ('wmic DESKTOPMONITOR get name,ScreenWidth,ScreenHeight,PNPDeviceID /value') do (
set /a tee+=1
if "!tee!" == "3" echo 类 型 = %b
if "!tee!" == "4" echo 其他信息 = %b
if "!tee!" == "5" echo 屏幕高 = %b
if "!tee!" == "6" echo 屏幕宽 = %b
)

D:\桌面>(
set /a tee+=1
if "!tee!" == "3" echo 类 型 =
if "!tee!" == "4" echo 其他信息 =
if "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)

D:\桌面>(
set /a tee+=1
if "!tee!" == "3" echo 类 型 =
if "!tee!" == "4" echo 其他信息 =
if "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)

D:\桌面>(
set /a tee+=1
  f "!tee!" == "3" echo 类 型 = 通用即插即用监视器
  f "!tee!" == "4" echo 其他信息 = 通用即插即用监视器
  f "!tee!" == "5" echo 屏幕高 = 通用即插即用监视器
if "!tee!" == "6" echo 屏幕宽 = 通用即插即用监视器
)
类 型 = 通用即插即用监视器

D:\桌面>(
set /a tee+=1
  f "!tee!" == "3" echo 类 型 = DISPLAY\TXD08C5\5&amp;AC7C279&amp;0&amp;UID12546
  f "!tee!" == "4" echo 其他信息 = DISPLAY\TXD08C5\5&amp;AC7C279&amp;0&amp;UID12546
  f "!tee!" == "5" echo 屏幕高 = DISPLAY\TXD08C5\5&amp;AC7C279&amp;0&amp;UID12546
if "!tee!" == "6" echo 屏幕宽 = DISPLAY\TXD08C5\5&amp;AC7C279&amp;0&amp;UID12546
)
其他信息 = DISPLAY\TXD08C5\5&amp;AC7C279&amp;0&amp;UID12546

D:\桌面>(
set /a tee+=1
  f "!tee!" == "3" echo 类 型 =
  f "!tee!" == "4" echo 其他信息 =
  f "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)
屏幕高 =

D:\桌面>(
set /a tee+=1
  f "!tee!" == "3" echo 类 型 =
  f "!tee!" == "4" echo 其他信息 =
  f "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)
屏幕宽 =

D:\桌面>(
set /a tee+=1
if "!tee!" == "3" echo 类 型 =
if "!tee!" == "4" echo 其他信息 =
if "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)

D:\桌面>(
set /a tee+=1
if "!tee!" == "3" echo 类 型 =
if "!tee!" == "4" echo 其他信息 =
if "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)

D:\桌面>(
set /a tee+=1
if "!tee!" == "3" echo 类 型 =
if "!tee!" == "4" echo 其他信息 =
if "!tee!" == "5" echo 屏幕高 =
if "!tee!" == "6" echo 屏幕宽 =
)

TOP

我写的第一段可以实现,就是不能自行判断,要你手动选择一下。如果要自行判断,你先外接一个显示器,执行一下第二种方法下面那段代码发我看下,我没有双显示器,没办法测试,在第二种方法下面加个计数器,在最后面做一下判断这个计数器的数值,就可以实现自行判断,而且语法可以缩短

TOP

我完成了,你试试
  1. color 0a
  2. title 硬件检测
  3. mode con cols=90
  4. sc config winmgmt start= auto >nul 2<&1
  5. net start winmgmt 2>1nul
  6. setlocal ENABLEDELAYEDEXPANSION
  7. set tee=0
  8. set loop=10
  9. for /f "tokens=1,* delims==" %%a in ('wmic DESKTOPMONITOR get name^,ScreenWidth^,ScreenHeight^,PNPDeviceID /value') do (
  10. set /a tee+=1
  11. if "!tee!" == "3" echo 类 型 = %%b
  12. if "%%b" == "" set /a loop -=1
  13. )
  14. if %%loop == 3 goto 1
  15. if %%loop == 4 goto 2
  16. :1
  17. displayswitch /internal
  18. pause>nul
  19. :2
  20. displayswitch /extend
  21. pause>nul
  22. pause
复制代码

TOP

本帖最后由 yakeyun 于 2023-1-15 14:25 编辑

回复 1# bcetl


既然只使用仅当前屏幕和扩展2种状态,那么直接检测当前系统的分辨率就可以了。如果分辨率屏幕宽度数值大于当前屏幕值,就属于扩展模式。反之相等就是仅当前屏幕模式。

弄错了,是检测截图的图片尺寸。借助了第三方截图工具(Snipaste),可以全屏截图2个屏幕,如果有更好的截图工具替代更好。
  1. @echo off & setlocal enabledelayedexpansion
  2. cd /d %~dp0
  3. if exist JT.jpg del JT.jpg
  4. if exist JT.txt del JT.txt
  5. :RUN
  6. @Start Snipaste.exe snip --full -o .\JT.jpg
  7. timeout -t 2 >NUL
  8. IF NOT EXIST JT.jpg GOTO RUN
  9. ::设置要搜索的图片格式
  10. set Pic=JT.jpg
  11. ::设置要搜索的文件主路径
  12. set DirPath=.\
  13. call :CreatVBS
  14. timeout -t 2 >NUL
  15. cd /d "%DirPath%"
  16. (for /f "delims=" %%a in ('dir /a-d/s/b %Pic%') do (
  17.     for /f "tokens=1-4 delims=x" %%b in ('cscript -nologo "%tmp%\GetImgInfo.vbs" "%%~sa"') do (
  18.         echo 文件名: %%~nxa    像素: %%~bx%%~c  原始格式: %%~e 路径: %%~dpa
  19.     )
  20. ))>"%~dp0JT.txt"
  21. timeout -t 2 >NUL
  22. for /f %%a in ('type "JT.TXT" ^|find "1920x1080"') do set DPI=1
  23. if defined DPI (displayswitch /extend)
  24. if NOT defined DPI (displayswitch /internal)
  25. EXIT
  26. :CreatVBS
  27. (echo '获取图片文件的宽、高、DPI、格式
  28. echo On Error Resume Next
  29. echo Dim Img
  30. echo Set Img = CreateObject^("WIA.ImageFile"^)
  31. echo Img.LoadFile WScript.Arguments^(0^)
  32. echo Wscript.Echo Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution ^& "x" ^& Img.FileExtension)>"%tmp%\GetImgInfo.vbs"
  33. goto :eof
复制代码
测试文件包:https://sanli.lanzoub.com/iokSL0l21gof

TOP

回复 7# mzzyb


    试运行了,切换不了,net start winmgmt 2>1nul这个代码还生成一个“1nul”的没用文件。

TOP

本帖最后由 mzzyb 于 2023-1-17 15:12 编辑

回复 9# bcetl


    我只有1个显示器的情况下是没问题的。
试试第五行改成,net start winmgmt 2>1 nul
忘了说了,你要以管理员的身份运行这个脚本

重新改了下,试试下面这个~
  1. color 0a
  2. title 硬件检测
  3. mode con cols=90
  4. sc config winmgmt start= auto >nul 2<&1
  5. net start winmgmt >nul 2>&1
  6. setlocal ENABLEDELAYEDEXPANSION
  7. set tee=0
  8. set loop=10
  9. for /f "tokens=1,* delims==" %%a in ('wmic DESKTOPMONITOR get name^,ScreenWidth^,ScreenHeight^,PNPDeviceID /value') do (
  10. set /a tee+=1
  11. if "!tee!" == "3" echo 类 型 = %%b
  12. if "%%b" == "" set /a loop -=1
  13. )
  14. echo %loop%
  15. if %loop% == 5 goto 1
  16. if %loop% == 6 goto 2
  17. :1
  18. displayswitch /internal
  19. pause>nul
  20. :2
  21. displayswitch /extend
  22. pause>nul
  23. pause
复制代码

TOP

回复 7# mzzyb


屏蔽输出的写法通常是这样:
  1. sc config winmgmt start= auto >nul 2>&1
  2. net start winmgmt >nul 2>&1
复制代码
或这样:
  1. sc config winmgmt start= auto >nul 2>nul
  2. net start winmgmt >nul 2>nul
复制代码
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。

TOP

回复 11# Batcher


    谢谢老大的指点,我是名86后,见证了论坛的兴起和没落,很庆幸,BAT没有死。这里,我学到了很多。

TOP

回复  mzzyb


屏蔽输出的写法通常是这样:或这样:
Batcher 发表于 2023-1-17 12:06



    谢谢B大,热爱bat,不用装软件 ,办事效率提高了很多。

TOP

回复  Batcher


    谢谢老大的指点,我是名86后,见证了论坛的兴起和没落,很庆幸,BAT没有死。这里, ...
mzzyb 发表于 2023-1-17 15:14



    亲,你那边测试没问题吗? 我这边切换不了。

TOP

回复 11# Batcher


   新年好, B大有办法不?

TOP

返回列表