标题: [文本处理] 电脑扩展屏幕到电视,如何做一键切换的BAT脚本? [打印本页]
作者: bcetl 时间: 2023-1-14 01:08 标题: 电脑扩展屏幕到电视,如何做一键切换的BAT脚本?
仅电脑屏幕
displayswitch /internal
复制屏幕
displayswitch /clone
扩展屏幕
displayswitch /extend
仅第二屏幕
displayswitch /external
一般常用,就”仅电脑屏幕“+”扩展屏幕“这2个。
希望能实现检测当前屏幕状态,
如果是”仅电脑屏幕“状态,则切换成”扩展“;
如果是”扩展“状态,则切换成”仅电脑屏幕“。
自制脚本目前已实现,可惜没有检测功能,无法一键自动切换。多点手脚。- @echo off&color 0a
- :nn
- echo.
- echo.
- echo ——————电脑屏幕扩展——————
- echo.
- echo.
- echo 0 关闭扩展(仅电脑屏幕)
- echo.
- echo + 扩展屏幕(扩展电视屏幕)
- echo.
- echo 1 复制屏幕(同步电脑屏幕)
- echo.
- echo 2 仅第二屏幕(切换到电视屏幕)
- echo.
- echo 0 退出
- echo.
- echo.
- echo.
- echo ——直接回车 (关闭扩展)
- echo.
- echo.
- set /p xz="请输入序号:"
- if not defined xz goto :aaa
- if "%xz%"=="0" goto aaa
- if "%xz%"=="+" goto bbb
- if "%xz%"=="1" goto ccc
- if "%xz%"=="2" goto ddd
-
- echo.
- echo.
- @echo 你没有输入正确值,即将退出
- ping -n 2 127.0.0.1 1>nul 2>nul
- cls
- goto ttt
-
-
-
- ::仅电脑屏幕
- :aaa
- cls
- echo.
- displayswitch /internal
- echo 仅电脑屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
- ::扩展屏幕
- :bbb
- cls
- echo.
- displayswitch /extend
- echo 扩展屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
- ::复制屏幕
- :ccc
- cls
- echo.
- displayswitch /clone
- echo.
- echo 复制屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
- ::仅第二屏幕
- :ddd
- cls
- echo.
- displayswitch /external
- echo 仅第二屏幕 & ping -n 2 127.0.0.1 1>nul 2>nul & cls & goto ttt
-
- :ttt
- exit
复制代码
作者: mzzyb 时间: 2023-1-14 10:48
本帖最后由 mzzyb 于 2023-1-14 12:00 编辑
2种解决方案,
第一种:把上面4条命令单独做成4个bat文件,你单击相应的就能实现相应的效果
第二种:做成1个bat文件,有交互,代码如下:- @echo off
- :start
- set /P a=(仅电脑屏幕输入1)(复制屏幕输入2)(扩展屏幕输入3)(仅第二屏幕输入4)
- if "%a%"=="1" cls & goto 1
- if "%a%"=="2" cls & goto 2
- if "%a%"=="3" cls & goto 3
- if "%a%"=="4" cls & goto 4
- :1
- displayswitch /internal
- pause>nul
- goto start
- :2
- displayswitch /clone
- pause>nul
- goto start
- :3
- displayswitch /exten
- pause>nul
- goto start
- :4
- displayswitch /external
- pause>nul
- goto start
复制代码
刚认真看了你的需求,应该要结合一下下面的命令:- color 0a
- title 硬件检测
- mode con cols=90
- sc config winmgmt start= auto >nul 2<&1
- net start winmgmt 2>1nul
- setlocal ENABLEDELAYEDEXPANSION
- set tee=0
- 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
- )
- set tee=0
- echo.
- pause
复制代码
但是bat只运行1次,所以要想办法让它一直运行检测,但是这样会小号系统资源。
作者: mzzyb 时间: 2023-1-14 11:41
我很好奇,你为什么不用快捷键win+p调出投影选项呀~~这样可能会更省事
作者: bcetl 时间: 2023-1-14 13:20
回复 3# mzzyb
win+P,在win10中反应较慢,不太灵敏。还必须先点一下任务栏,按完快捷键还迟2~3秒才弹出选项。
作者: bcetl 时间: 2023-1-14 13:27
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&AC7C279&0&UID12546
f "!tee!" == "4" echo 其他信息 = DISPLAY\TXD08C5\5&AC7C279&0&UID12546
f "!tee!" == "5" echo 屏幕高 = DISPLAY\TXD08C5\5&AC7C279&0&UID12546
if "!tee!" == "6" echo 屏幕宽 = DISPLAY\TXD08C5\5&AC7C279&0&UID12546
)
其他信息 = DISPLAY\TXD08C5\5&AC7C279&0&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 屏幕宽 =
)
作者: mzzyb 时间: 2023-1-14 13:58
我写的第一段可以实现,就是不能自行判断,要你手动选择一下。如果要自行判断,你先外接一个显示器,执行一下第二种方法下面那段代码发我看下,我没有双显示器,没办法测试,在第二种方法下面加个计数器,在最后面做一下判断这个计数器的数值,就可以实现自行判断,而且语法可以缩短
作者: mzzyb 时间: 2023-1-14 16:56
我完成了,你试试- color 0a
- title 硬件检测
- mode con cols=90
- sc config winmgmt start= auto >nul 2<&1
- net start winmgmt 2>1nul
- setlocal ENABLEDELAYEDEXPANSION
- set tee=0
- set loop=10
- 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 "%%b" == "" set /a loop -=1
- )
- if %%loop == 3 goto 1
- if %%loop == 4 goto 2
- :1
- displayswitch /internal
- pause>nul
- :2
- displayswitch /extend
- pause>nul
- pause
复制代码
作者: yakeyun 时间: 2023-1-14 20:24
本帖最后由 yakeyun 于 2023-1-15 14:25 编辑
回复 1# bcetl
既然只使用仅当前屏幕和扩展2种状态,那么直接检测当前系统的分辨率就可以了。如果分辨率屏幕宽度数值大于当前屏幕值,就属于扩展模式。反之相等就是仅当前屏幕模式。
弄错了,是检测截图的图片尺寸。借助了第三方截图工具(Snipaste),可以全屏截图2个屏幕,如果有更好的截图工具替代更好。- @echo off & setlocal enabledelayedexpansion
- cd /d %~dp0
-
- if exist JT.jpg del JT.jpg
- if exist JT.txt del JT.txt
- :RUN
- @Start Snipaste.exe snip --full -o .\JT.jpg
- timeout -t 2 >NUL
- IF NOT EXIST JT.jpg GOTO RUN
- ::设置要搜索的图片格式
- set Pic=JT.jpg
- ::设置要搜索的文件主路径
- set DirPath=.\
- call :CreatVBS
- timeout -t 2 >NUL
- cd /d "%DirPath%"
- (for /f "delims=" %%a in ('dir /a-d/s/b %Pic%') do (
- for /f "tokens=1-4 delims=x" %%b in ('cscript -nologo "%tmp%\GetImgInfo.vbs" "%%~sa"') do (
- echo 文件名: %%~nxa 像素: %%~bx%%~c 原始格式: %%~e 路径: %%~dpa
- )
- ))>"%~dp0JT.txt"
- timeout -t 2 >NUL
- for /f %%a in ('type "JT.TXT" ^|find "1920x1080"') do set DPI=1
- if defined DPI (displayswitch /extend)
- if NOT defined DPI (displayswitch /internal)
- EXIT
-
-
- :CreatVBS
- (echo '获取图片文件的宽、高、DPI、格式
- echo On Error Resume Next
- echo Dim Img
- echo Set Img = CreateObject^("WIA.ImageFile"^)
- echo Img.LoadFile WScript.Arguments^(0^)
- echo Wscript.Echo Img.Width ^& "x" ^& Img.Height ^& "x" ^& Img.HorizontalResolution ^& "x" ^& Img.FileExtension)>"%tmp%\GetImgInfo.vbs"
- goto :eof
复制代码
测试文件包:https://sanli.lanzoub.com/iokSL0l21gof
作者: bcetl 时间: 2023-1-16 22:31
回复 7# mzzyb
试运行了,切换不了,net start winmgmt 2>1nul这个代码还生成一个“1nul”的没用文件。
作者: mzzyb 时间: 2023-1-17 11:46
本帖最后由 mzzyb 于 2023-1-17 15:12 编辑
回复 9# bcetl
我只有1个显示器的情况下是没问题的。
试试第五行改成,net start winmgmt 2>1 nul
忘了说了,你要以管理员的身份运行这个脚本
重新改了下,试试下面这个~- color 0a
- title 硬件检测
- mode con cols=90
- sc config winmgmt start= auto >nul 2<&1
- net start winmgmt >nul 2>&1
- setlocal ENABLEDELAYEDEXPANSION
- set tee=0
- set loop=10
- 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 "%%b" == "" set /a loop -=1
- )
- echo %loop%
- if %loop% == 5 goto 1
- if %loop% == 6 goto 2
- :1
- displayswitch /internal
- pause>nul
- :2
- displayswitch /extend
- pause>nul
- pause
复制代码
作者: Batcher 时间: 2023-1-17 12:06
回复 7# mzzyb
屏蔽输出的写法通常是这样:- sc config winmgmt start= auto >nul 2>&1
- net start winmgmt >nul 2>&1
复制代码
或这样:- sc config winmgmt start= auto >nul 2>nul
- net start winmgmt >nul 2>nul
复制代码
作者: mzzyb 时间: 2023-1-17 15:14
回复 11# Batcher
谢谢老大的指点,我是名86后,见证了论坛的兴起和没落,很庆幸,BAT没有死。这里,我学到了很多。
作者: bcetl 时间: 2023-1-21 14:16
回复 mzzyb
屏蔽输出的写法通常是这样:或这样:
Batcher 发表于 2023-1-17 12:06
谢谢B大,热爱bat,不用装软件 ,办事效率提高了很多。
作者: bcetl 时间: 2023-1-21 14:19
回复 Batcher
谢谢老大的指点,我是名86后,见证了论坛的兴起和没落,很庆幸,BAT没有死。这里, ...
mzzyb 发表于 2023-1-17 15:14
亲,你那边测试没问题吗? 我这边切换不了。
作者: bcetl 时间: 2023-1-24 00:49
回复 11# Batcher
新年好, B大有办法不?
作者: mzzyb 时间: 2023-1-28 12:00
本帖最后由 mzzyb 于 2023-1-29 11:49 编辑
回复 14# bcetl
我这边没问题,你把运行的界面复制上来我看下。需要接两台显示的状态下,因为我只接1台显示器的时候,我看到它执行对了,应该要改下细节参数
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |