Board logo

标题: 根据显示器大小设置桌面的批处理为何有的机器能运行,有的出错? [打印本页]

作者: seasonsoft    时间: 2009-12-9 10:39     标题: 根据显示器大小设置桌面的批处理为何有的机器能运行,有的出错?

@echo off
for /f "delims=" %%i in ('Wmic DesktopMonitor Get ScreenHeight^,ScreenWidth /Value') do set "%%i">nul 2>nul
if %ScreenWidth%==1280 (
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /d c:\tobacco1280.bmp /f
) else (
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /d c:\tobacco1024.bmp /f
)
RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters


以上代码,在有的机器上运行成功,有的机器上运行提示“此时不应有 (”,请问如何解决。谢谢!

[ 本帖最后由 seasonsoft 于 2009-12-9 10:58 编辑 ]
作者: batman    时间: 2009-12-9 11:03

估计是有的机器上没有安装好wmic,还有windows2000上没有reg命令。
作者: seasonsoft    时间: 2009-12-9 11:05

操作系统方面都是XP没问题。WMIC怎么安装?
作者: batman    时间: 2009-12-9 11:13     标题: 回复 3楼 的帖子

在cmd中键入wmic回车
作者: seasonsoft    时间: 2009-12-9 11:56

如何加入到我的BAT里?
作者: seasonsoft    时间: 2009-12-9 14:43

经过检查,运行成功的机器上CMD里运行
for /f "delims=" %i in ('Wmic DesktopMonitor Get ScreenHeight^,ScreenWidth /Value') do set "%i">nul 2>nul
回显内容为:
1>nul 2>nul

1>nul 2>nul

1>nul 2>nul nHeight=1024

1>nul 2>nul nWidth=1280

1>nul 2>nul

1>nul 2>nul

而运行不成功的机器上CMD里运行同样一段代码的回显结果是
1>nul 2>nul

1>nul 2>nul

1>nul 2>nul nHeight=1024

1>nul 2>nul nWidth=1280

1>nul 2>nul

1>nul 2>nul

1>nul 2>nul nHeight=

1>nul 2>nul nWidth=

1>nul 2>nul

1>nul 2>nul
下面多了四行内容,变量似乎被清空了,请高手帮忙判断原因。谢谢
作者: lxzzr    时间: 2009-12-9 15:56

你是设置桌面吧,你代码中的“%ScreenWidth%”是哪来的??

另外在写代码的时候最好规范点。。。
作者: 523066680    时间: 2009-12-9 16:06

报告,我在linux下执行,不成功。
尤其是那个reg, 找不到~  
(莫打我耶)

[ 本帖最后由 523066680 于 2009-12-9 16:11 编辑 ]
作者: seasonsoft    时间: 2009-12-9 17:07

这段代码是网上搜集的,在多数机器(XP系统)上运行可以通过,在少数电脑上出现问题。
作者: Batcher    时间: 2009-12-9 23:57

  1. @echo off
  2. for /f "tokens=1-2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenHeight^,ScreenWidth /Value') do (
  3.   if "%%i" equ "ScreenWidth" (
  4.     if "%%j" equ "1280" (
  5.       reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco1280.bmp /f
  6.     ) else (
  7.       reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco1024.bmp /f
  8.     )
  9.     RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
  10.     goto :eof
  11.   )
  12. )
复制代码

作者: seasonsoft    时间: 2009-12-10 08:19

10楼的方案经测试,执行的一直是else下的语句,即使if条件成立。
作者: batman    时间: 2009-12-10 09:49

既然在wmic中就直接获得了屏幕的宽度(好像得到的高度是没用的),那么接下来的操作就完全可以简化了:
  1. @echo off
  2. for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do (
  3.      reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%%i.bmp /f
  4.      RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
  5. )
复制代码

作者: seasonsoft    时间: 2009-12-10 10:04

12楼的我试过了,壁纸被改成了空白的,我加了echo %%i看了i的结果,运行结果如下:
C:\>test.bat
1280

操作成功结束

个人感觉好像是壁纸先被正确的改为了1280分辨率,但第二次循环的时候i成空了,壁纸成了tobacco.bmp
我是新手,请多多指教
作者: batman    时间: 2009-12-10 10:07     标题: 回复 13楼 的帖子

这样呢:
  1. @echo off
  2. for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do (
  3.      reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%%i.bmp /f
  4.      RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
  5.      goto :eof
  6. )
复制代码

作者: seasonsoft    时间: 2009-12-10 10:14

我试了,注册表键值是正确改过来了的,但是桌面壁纸没有了,一块蓝板
作者: batman    时间: 2009-12-10 10:23

没办法这样应该行了吧:
  1. @echo off
  2. for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do set "str=%%i"
  3. reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%str%.bmp /f
  4. RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
复制代码

[ 本帖最后由 batman 于 2009-12-10 10:32 编辑 ]
作者: seasonsoft    时间: 2009-12-10 11:07

我试了,还是一部分机器行,有的机器运行后注册表键值成了tobacco.bmp
作者: batman    时间: 2009-12-10 11:42

真不知道那些机器的wmic得出的信息是怎样的,这样再试试:
  1. @echo off
  2. for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do (
  3.      set "str=%%i"
  4.      if defined str goto next
  5. )
  6. :next
  7. reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%str%.bmp /f
  8. RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
复制代码

作者: seasonsoft    时间: 2009-12-10 11:48

我试了,在正常运行的机器上运行Wmic DesktopMonitor Get ScreenWidth /Value这一句后返回的是
screenwidth=1280
但在运行不成功的机器上运行Wmic DesktopMonitor Get ScreenWidth /Value后返回的是
screenwidth=1280
screenwidth=
也就是说连续返回两次screenwidth,第一次是正确的,第二次就变成空值了,不知为何
作者: batman    时间: 2009-12-10 11:50     标题: 回复 19楼 的帖子

试了我上面的代码吗?
作者: seasonsoft    时间: 2009-12-10 11:53

18楼的方案成功了!非常感谢batman版主!辛苦你了!只是我不明白为什么会出现19楼这样的问题
作者: batman    时间: 2009-12-10 11:54     标题: 回复 21楼 的帖子

这个问题很很简单:是操作系统问题。
作者: seasonsoft    时间: 2009-12-10 11:56

操作系统哪里出问题了呢。对不起,我是批处理门外汉
作者: batman    时间: 2009-12-10 12:14

有的操作系统是默认开了两个屏的,一个主屏,一个扩展屏(用来向另一显示设备输出的),所以wmic会获取两个屏的宽度信息,如果扩展屏没有设置好值,获取的值就为空了。
作者: Batcher    时间: 2009-12-10 12:55     标题: 回复 11楼 的帖子

测试过程贴出来看看?
作者: 523066680    时间: 2009-12-14 08:35     标题: 回复 26楼 的帖子

把这种心理明示,这下你就不对了。结合之前发生的事情,估计他们会来P的,我旁观。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2