标题: 根据显示器大小设置桌面的批处理为何有的机器能运行,有的出错? [打印本页]
作者: 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
- @echo off
- for /f "tokens=1-2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenHeight^,ScreenWidth /Value') do (
- if "%%i" equ "ScreenWidth" (
- if "%%j" equ "1280" (
- reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco1280.bmp /f
- ) else (
- reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco1024.bmp /f
- )
- RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
- goto :eof
- )
- )
复制代码
作者: seasonsoft 时间: 2009-12-10 08:19
10楼的方案经测试,执行的一直是else下的语句,即使if条件成立。
作者: batman 时间: 2009-12-10 09:49
既然在wmic中就直接获得了屏幕的宽度(好像得到的高度是没用的),那么接下来的操作就完全可以简化了:- @echo off
- for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do (
- reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%%i.bmp /f
- RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
- )
复制代码
作者: 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楼 的帖子
这样呢:- @echo off
- for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do (
- reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%%i.bmp /f
- RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters
- goto :eof
- )
复制代码
作者: seasonsoft 时间: 2009-12-10 10:14
我试了,注册表键值是正确改过来了的,但是桌面壁纸没有了,一块蓝板
作者: batman 时间: 2009-12-10 10:23
没办法这样应该行了吧:- @echo off
- for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do set "str=%%i"
- reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%str%.bmp /f
- 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得出的信息是怎样的,这样再试试:- @echo off
- for /f "tokens=2 delims==" %%i in ('Wmic DesktopMonitor Get ScreenWidth /Value') do (
- set "str=%%i"
- if defined str goto next
- )
- :next
- reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d c:\tobacco%str%.bmp /f
- 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 |