找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 77657|回复: 20

[其他] 批处理读取本机分辨率判断执行nconvert的困惑

[复制链接]
发表于 2020-10-1 00:39:24 | 显示全部楼层 |阅读模式
本帖最后由 kensami727 于 2020-10-4 01:50 编辑

我需要nconvert合成图片,然后有几种分辨率,nconvert坐标不一样,所以我就想着比较机器号数字,或者抓取系统分辨率来goto。
set bz1="bz1\x.jpg"
set bz2="bz2\x.jpg"
for /f "delims=" %%i in ('wmic DesktopMonitor get ScreenWidth^,ScreenHeight /value ^| findstr "="') do set "%%i"
if %ScreenWidth% leq 1920 (goto pc1k) else (goto pc2k)
:pc1k
nconvert----------%bz1%
:pc2k
nconvert----------%bz2%
if exist xxx.jpg (goto wallpaper) else (goto err)


问题已经解决,我编辑了一下,方便以后有同样问题的朋友理解。我遇到两个问题。
问题一、分辨率没有获取到,造成后续的if leq之类比较不成功,不知道是特殊字符还是win10的原因,后来换成Win32_VideoController在win10下是可以获取的,但Win32_VideoController获取的并不是当前设置的分辨率,如果2k当1080用,还是会出问题,而DesktopMonitor在win10获取的是空值。管理员提示我处理特殊字符,但我是新手始终搞不定。
问题二、总是依次执行:pc1k和:pc2k,本来if就不成功,现在更加废了。

使用了很多方法,我甚至是for set version来判断系统内核,再使用if DesktopMonitor和Win32_VideoController双条件来获取分辨率。但因为win32读的是显示器的分辨率,最终还是放弃。

关于重复执行的问题,按2楼大佬提醒,我没有成功,因为合成后后续还有其它命令需要执行,这时候goto :eof,合成完图片批处理就直接终止了。干脆把pc2k的nconvert 切到另外一个批处理解决,这时候又被管理员提醒了一次。
再次翻阅goto :eof,把goto换成了call,然后在pc1k和pc2k段下加goto :eof,让命令能够返回执行下一段powershell,最终解决代码如下:

for /f "tokens=1-2 delims= " %%a in ('mshta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(screen.width&"" ""&screen.height)"^)(close^)') do (set fbl=%%a)
if %fbl% leq 1920 (call :pc1k) else (call :pc2k)
发表于 2020-10-1 10:11:52 | 显示全部楼层
本帖最后由 yhcfsr 于 2020-10-1 10:16 编辑

在pc1 和pc2 的段尾都加上
  1. goto :eof
复制代码
 楼主| 发表于 2020-10-1 13:57:55 | 显示全部楼层
本帖最后由 kensami727 于 2020-10-1 14:51 编辑

这样写会造成我后面无法设置壁纸的,而且问题依然存在,无论是机号大小判断还是分辨率判断都没用。都跑到pc2。EQU、NEQ、LSS、LEQ、GTR、GEQ我都来回换了个遍,虽然有些能够使pc1正常,但从整个IF来说,却是失败的。
这后面接的设置壁纸,为了便于测试,我把变量都改成固定值了。
if exist 100.jpg (goto wp) else (goto err)

现在问题应该在于我的批处理并没有读书正确的分辨率,所以GTR失败
发表于 2020-10-1 14:56:15 | 显示全部楼层
设个标签 然后跳转过去
 楼主| 发表于 2020-10-1 16:48:43 | 显示全部楼层
哎脑壳疼。
发表于 2020-10-2 08:43:45 | 显示全部楼层
回复 3# kensami727


初步判断是因为wmic命令结果里面的特殊字符导致%ScreenWidth%的值里面有特殊字符,所以if判断失败。

验证方式:
echo ===%ScreenWidth%===

解决方法:批处理调用WMIC时如何处理结果中的特殊字符?
http://bbs.bathome.net/thread-2862-1-1.html
http://bbs.bathome.net/thread-28534-1-1.html
http://bbs.bathome.net/thread-28535-1-1.html
http://bbs.bathome.net/thread-12033-1-1.html
 楼主| 发表于 2020-10-3 17:53:35 | 显示全部楼层
本帖最后由 kensami727 于 2020-10-3 17:54 编辑

echo 屏幕分辨率宽 %ScreenWidth%
楼上大佬,前天我这样试过,没有数据显示。
用你的表达会更直观清晰,输出显示:======
%computername%是可以的。
 楼主| 发表于 2020-10-3 19:01:18 | 显示全部楼层
除了大佬指定的特殊字符问题以外,我刚才测试了好久,哪怕我使用mshta VBScript:Execute("CreateOb方式
又或者wmic path Win32_VideoController
win32是能够echo出正确的分辨率的,但是.....没用。
你们猜我最终怎么解决的。。。。
虽然已经能够读取到正确的分辨率变量,但仔细观察,批处理还是会依次运行pc1和pc2,我搞不定,干脆直接把pc2给删除了。然后goto pc2改成start pc2.bat问题解决。
发表于 2020-10-3 20:56:43 | 显示全部楼层
回复 8# kensami727


你可能没有理解2楼的意思,他是说改成这样:
  1. :pc1
  2. nconvert -text_font 微软雅黑 30 -text_pos 675 845 -text_color 255 0 0 -text "!text!" -text_font 微软雅黑 36 -text_pos 860 40 -text_color 0 0 0 -text "%jqh%" -wmpos 2246 905 -wmfile %pic% -out jpeg -overwrite -o %jpg_output% %bz1%
  3. goto :eof

  4. :pc2
  5. nconvert -text_font 微软雅黑 30 -text_pos 675 845 -text_color 255 0 0 -text "!text!" -text_font 微软雅黑 36 -text_pos 860 40 -text_color 0 0 0 -text "%jqh%" -wmpos 1400 618 -wmfile %pic% -out jpeg -overwrite -o %jpg_output% %bz2%
  6. goto :eof
复制代码
 楼主| 发表于 2020-10-3 22:45:23 | 显示全部楼层
本帖最后由 kensami727 于 2020-10-3 23:00 编辑

是这样改的呢,因为我的分辨率获取到的是空值,所以即使加了goto :eof也是没有用的。GTR比较仍然是不成功。
而且在图片合成之后,还需要设置壁纸。加了goto :eof之后
后续的if exist 100.jpg (goto wp) else (goto err)就没法执行了。合成壁纸之后程序就直接退出。
我现在用的是下面这段获取的分辨率,在win10已经可以正常获取了。系统是win7和win10均有。win7暂未测试。然后测试将第二段nconvert剪切到第二个bat里面。暂时能用。当然还是需要摸索一下我的bat到底哪里有语法错误。
for /f "delims=" %%# in  ('"wmic path Win32_VideoController  get CurrentHorizontalResolution,CurrentVerticalResolution /format:value"') do (set "%%#">nul)

请教一下wmic DesktopMonitor支持win10吗?
 楼主| 发表于 2020-10-3 23:40:15 | 显示全部楼层
if %CurrentHorizontalResolution% GTR 1920 (goto pc1) else (goto pc2)
改成if %CurrentHorizontalResolution% GTR 1920 (call :pc1) else (call :pc2)
就可以从goto :eof返回执行if exist 100.jpg (goto wp) else (goto err)了。
 楼主| 发表于 2020-10-4 00:08:55 | 显示全部楼层
wmic Win32_VideoController
wmic DesktopMonitor
哪位大佬能否讲解一下上面两个wmic命令
Win32_VideoController并不是获取当前所使用的分辨率,还是有弊端的。比如2K显示器非要设置1080用,那不是GG了。可DesktopMonitor我在win10上面又死活无法输出正常的分辨率。
 楼主| 发表于 2020-10-4 01:32:57 | 显示全部楼层
for /f "tokens=1-2 delims= " %%a in ('mshta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(screen.width&"" ""&screen.height)"^)(close^)') do (set fbl=%%a)
if %fbl% leq 1920 (call :pc1k) else (call :pc2k)
发表于 2020-10-4 09:43:53 | 显示全部楼层
抓机器分辨率:

  1. [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms");
  2. $width=[System.Windows.Forms.SystemInformation]::PrimaryMonitorSize.Width;
  3. $height=[System.Windows.Forms.SystemInformation]::PrimaryMonitorSize.Height;
复制代码
发表于 2020-10-4 12:20:28 | 显示全部楼层
回复 13# kensami727


调用 mshta 可能会被某些杀软拦截,也可以考虑 reg query 读取注册表:
http://bbs.bathome.net/thread-40744-1-1.html#pid186742

1.bat
  1. @echo off
  2. for /f "tokens=1,3" %%i in ('reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UnitedVideo" /s') do (
  3.     if "%%i" equ "DefaultSettings.XResolution" (
  4.         set /a ScreenWidth=%%j
  5.     ) else (
  6.         if "%%i" equ "DefaultSettings.YResolution" (
  7.             set /a ScreenHeight=%%j
  8.         )
  9.     )
  10. )
  11. echo ScreenWidth=%ScreenWidth%
  12. echo ScreenHeight=%ScreenHeight%
  13. pause
复制代码
2.bat
  1. @echo off
  2. for /f "tokens=1-2" %%a in ('mshta VBScript:Execute("CreateObject(""Scripting.Filesystemobject"").GetStandardStream(1).Write(screen.width&"" ""&screen.height)"^)(close^)') do (
  3.     set "ScreenWidth=%%a"
  4.     set "ScreenHeight=%%b"
  5. )
  6. echo ScreenWidth=%ScreenWidth%
  7. echo ScreenHeight=%ScreenHeight%
  8. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 04:28 , Processed in 0.020560 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表