中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-03 23:59
48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » BAT转VBS问题
可打印版本  2,964 / 18
第1楼 djhui 发表于 2007-03-28 07:13
初级用户 发帖 10 积分 28
BAT转VBS问题
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楼 bjsh 发表于 2007-03-28 07:15
银牌会员 发帖 621 积分 2,000
自己动手
第3楼 djhui 发表于 2007-03-28 07:23
初级用户 发帖 10 积分 28
手动太麻烦,编个P处理自己又不会!所以我才发贴要别人帮助啊,不然我发贴干嘛
第4楼 KANXM 发表于 2007-03-28 13:32
社区乞丐 发帖 8 积分 -174
我也想学学
这种知识我也想学学,教教我好吗?
第5楼 KANXM 发表于 2007-03-28 13:36
社区乞丐 发帖 8 积分 -174
补充
刚才忘了说,可别说的太深奥哇! 不然我听不懂(我是外星人!@!#$%@#$#)
第6楼 estar 发表于 2007-03-29 03:29
中级用户 发帖 103 积分 346
体力活是入门必修课之一
第7楼 bjsh 发表于 2007-03-29 05:22
银牌会员 发帖 621 积分 2,000
你的这个问题可把我给难死了;

什么问题都好解决;

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

改个题目吧;......让大家都来写写
第8楼 flyinspace 发表于 2007-03-29 05:32
银牌会员 发帖 517 积分 1,206
哦。那你把所有的特殊字符都列出来。。写在一个记事本里。
然后一个一个的判断。
这个文件若是很长的话。
估计等的时间可以气死你了。
第9楼 flyinspace 发表于 2007-03-29 05:35
银牌会员 发帖 517 积分 1,206
所以说。还不如用c++写一个。。

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

而且执行也会快很多。
第10楼 bjsh 发表于 2007-03-29 06:40
银牌会员 发帖 621 积分 2,000
Originally posted by flyinspace at 2007-3-28 04:32 PM:
哦。那你把所有的特殊字符都列出来。。写在一个记事本里。
然后一个一个的判断。
这个文件若是很长的话。
估计等的时间可以气死你了。



不是这么简单的问题;

特殊符号也不是轻易能取的出来的,不信自己试试
第11楼 flyinspace 发表于 2007-03-29 08:01
银牌会员 发帖 517 积分 1,206
可以取出来的。。
试过好几个特殊符号都取出来了。。
至于其他的。没工夫试。。
也不想试。。还不如用c++写。
第12楼 bjsh 发表于 2007-03-29 09:09
银牌会员 发帖 621 积分 2,000
你自己试试用引号
第13楼 bjsh 发表于 2007-03-29 22:37
银牌会员 发帖 621 积分 2,000
终于解决了你的问题了;

type 1.txt |shellesc >3.txt


shellesc这东西太好了
第14楼 bjsh 发表于 2007-03-30 07:17
银牌会员 发帖 621 积分 2,000
不借助第三方工具的代码



  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楼 axi 发表于 2007-03-30 13:21
中级用户 发帖 93 积分 238 来自 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 ]
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023