中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-03 21:47
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » BAT转VBS问题 查看 2,956 回复 18
楼 主 BAT转VBS问题 发表于 2007-03-28 07:13 ·  中国 浙江 丽水 电信
初级用户
积分 28
发帖 10
注册 2006-11-22 10:02
19年会员
UID 71367
性别 男
状态 离线
echo strComputer = ".">>tmp.vbs
echo Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")>>tmp.vbs
echo Set colItems = objWMIService.ExecQuery _>>tmp.vbs
echo ("Select * From Win32_DisplayConfiguration")>>tmp.vbs
echo For Each objItem in colItems>>tmp.vbs
echo Wscript.Echo "显示芯片: " & objItem.DeviceName&+vbcrlf&"色深: " & objItem.BitsPerPel & "位"&+vbcrlf&"分辨率: " & objItem.PelsWidth & "*" & objItem.PelsHeight>>tmp.vbs
echo >>tmp.vbs
echo Next>>tmp.vbs
echo >>tmp.vbs
start tmp.vbs
就拿这个来说吧,因为有些字符须要在前面加一个"^"才能写入VBS,但手动加这个符号又太麻烦,谁能帮我做个批处理,把一个DOS特殊字符前加上^
2 发表于 2007-03-28 07:15 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
自己动手
3 发表于 2007-03-28 07:23 ·  中国 浙江 丽水 电信
初级用户
积分 28
发帖 10
注册 2006-11-22 10:02
19年会员
UID 71367
性别 男
状态 离线
手动太麻烦,编个P处理自己又不会!所以我才发贴要别人帮助啊,不然我发贴干嘛
4 我也想学学 发表于 2007-03-28 13:32 ·  中国 黑龙江 哈尔滨 联通
社区乞丐
积分 -174
发帖 8
注册 2007-03-01 14:28
19年会员
UID 80485
性别 男
状态 离线
这种知识我也想学学,教教我好吗?
5 补充 发表于 2007-03-28 13:36 ·  中国 黑龙江 哈尔滨 联通
社区乞丐
积分 -174
发帖 8
注册 2007-03-01 14:28
19年会员
UID 80485
性别 男
状态 离线
刚才忘了说,可别说的太深奥哇! 不然我听不懂(我是外星人!@!#$%@#$#)
6 发表于 2007-03-29 03:29 ·  中国 四川 成都 教育网
中级用户
★★
积分 346
发帖 103
注册 2004-04-06 00:00
22年会员
UID 21852
性别 男
状态 离线
体力活是入门必修课之一
7 发表于 2007-03-29 05:22 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
你的这个问题可把我给难死了;

什么问题都好解决;

就是一个引号;我整整折腾了12个小时;这个时间还在持续......

改个题目吧;......让大家都来写写
8 发表于 2007-03-29 05:32 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
哦。那你把所有的特殊字符都列出来。。写在一个记事本里。
然后一个一个的判断。
这个文件若是很长的话。
估计等的时间可以气死你了。
9 发表于 2007-03-29 05:35 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
所以说。还不如用c++写一个。。

这些判断也要不了多长时间就可以写好。。

而且执行也会快很多。
10 发表于 2007-03-29 06:40 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
Originally posted by flyinspace at 2007-3-28 04:32 PM:
哦。那你把所有的特殊字符都列出来。。写在一个记事本里。
然后一个一个的判断。
这个文件若是很长的话。
估计等的时间可以气死你了。



不是这么简单的问题;

特殊符号也不是轻易能取的出来的,不信自己试试
11 发表于 2007-03-29 08:01 ·  中国 广东 广州 海珠区 电信
银牌会员
★★★
积分 1,206
发帖 517
注册 2007-03-25 01:18
19年会员
UID 82819
性别 男
状态 离线
可以取出来的。。
试过好几个特殊符号都取出来了。。
至于其他的。没工夫试。。
也不想试。。还不如用c++写。
12 发表于 2007-03-29 09:09 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
你自己试试用引号
13 发表于 2007-03-29 22:37 ·  中国 浙江 杭州 华数宽带
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
终于解决了你的问题了;

type 1.txt |shellesc >3.txt


shellesc这东西太好了
14 发表于 2007-03-30 07:17 ·  中国 浙江 杭州 华数宽带
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
不借助第三方工具的代码



  1. @echo off
  2. if exist tmp.txt del tmp.txt
  3. for /f "tokens=1 delims=" %%a in (test.txt) do set "var=%%a" & call :change
  4. goto exit
  5. :change
  6. set "var=%var:^=^^%"
  7. set "var=%var:>=^>%"
  8. set "var=%var:<=^<%"
  9. set "var=%var:&=^&%"
  10. set "var=%var:|=^|%"
  11. set /p "=%var%" <nul >>tmp.txt
  12. echo. >>tmp.txt
  13. :exit
BJSH发表于: 2007-03-29 18:08


想说一下第十一行和十二行;
因为几乎每一行都含有特殊符号
虽然都添加了一个^符号但是用echo写入其他文本就会去掉^
使得所得tmp.txt内容和原文本是一模一样的;
如果用^^来做echo 会当作不存在^来执行
比如echo ^^&和echo & 是一样的都会报错
想过用set var >>tmp.txt 可是每一行又都多出var=...
又想过用for来"tokens=2 delims=var="可是后面的又怎么输出呢;用echo?还是前面的问题.

终于发现了set var"= " <nu >>tmp.txtl的有个好的特性;
一般我用它的目的都是不换行;这次用做写入文本的算是一个创新吧
随后再加上 echo.
终于解决了问题....

总结自己的收获
echo 对于特殊字符写入文本的问题;
用 set /p ''= " <nul >> & echo.
解决了

[ Last edited by bjsh on 2007-3-29 at 06:30 PM ]
15 发表于 2007-03-30 13:21 ·  中国 广东 广州 电信
中级用户
★★
脚本爱好者
积分 238
发帖 93
注册 2007-03-11 13:38
19年会员
UID 81417
性别 男
来自 GZ
状态 离线
如果想在批处理中创建多个VBS又不想考虑特殊字符问题,可以在VBS每行代码后加上标记,然后用 find 的方法取出标记内容来创建VBS, 如下:

@echo off
findstr "'%skip%VBS1" "%~f0" >killvbs.vbs
findstr "'%skip%VBS2" "%~f0" >tmp.vbs
start tmp.vbs
exit

strComputer = "." 'VBS1
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 'VBS1
Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'wscript.exe'") 'VBS1
For Each objProcess in colProcessList 'VBS1
objProcess.Terminate() 'VBS1
Next 'VBS1


strComputer = "." 'VBS2
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 'VBS2
Set colItems = objWMIService.ExecQuery ("Select * From Win32_DisplayConfiguration") 'VBS2
For Each objItem in colItems 'VBS2
Wscript.Echo "显示芯片: " & objItem.DeviceName&+vbcrlf&"色深: " & objItem.BitsPerPel & "位"&+vbcrlf&"分辨率: " & objItem.PelsWidth & "*" & objItem.PelsHeight 'VBS2
Next 'VBS2

以上内容参考了 “批处理与其他语言混合编程” 中的 find 大法。

自动给文本每行后加上标记的方法:
@echo off
for /f "tokens=*" %%a in (tmp.txt) do echo %%a 'VBS2>>t.txt

把 t.txt 中的内容复制到创建VBS的批处理中即可。

还可以用 more 大法来完成楼主的B转V方案:

@echo off
more +2 %0>>tmp.vbs&&start tmp.vbs&exit
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_DisplayConfiguration")
For Each objItem in colItems
Wscript.Echo "显示芯片: " & objItem.DeviceName&+vbcrlf&"色深: " & objItem.BitsPerPel & "位"&+vbcrlf&"分辨率: " & objItem.PelsWidth & "*" & objItem.PelsHeight

Next

[ Last edited by axi on 2007-3-30 at 11:16 AM ]
论坛跳转: