Board logo

标题: BAT转VBS问题 [打印本页]

作者: djhui     时间: 2007-3-28 07:13    标题: 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特殊字符前加上^
作者: bjsh     时间: 2007-3-28 07:15
自己动手
作者: djhui     时间: 2007-3-28 07:23
手动太麻烦,编个P处理自己又不会!所以我才发贴要别人帮助啊,不然我发贴干嘛
作者: KANXM     时间: 2007-3-28 13:32    标题: 我也想学学

这种知识我也想学学,教教我好吗?
作者: KANXM     时间: 2007-3-28 13:36    标题: 补充

刚才忘了说,可别说的太深奥哇! 不然我听不懂(我是外星人!@!#$%@#$#)
作者: estar     时间: 2007-3-29 03:29
体力活是入门必修课之一
作者: bjsh     时间: 2007-3-29 05:22
你的这个问题可把我给难死了;

什么问题都好解决;

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

改个题目吧;......让大家都来写写
作者: flyinspace     时间: 2007-3-29 05:32
哦。那你把所有的特殊字符都列出来。。写在一个记事本里。
然后一个一个的判断。
这个文件若是很长的话。
估计等的时间可以气死你了。
作者: flyinspace     时间: 2007-3-29 05:35
所以说。还不如用c++写一个。。

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

而且执行也会快很多。
作者: bjsh     时间: 2007-3-29 06:40


  Quote:
Originally posted by flyinspace at 2007-3-28 04:32 PM:
哦。那你把所有的特殊字符都列出来。。写在一个记事本里。
然后一个一个的判断。
这个文件若是很长的话。
估计等的时间可以气死你了。

不是这么简单的问题;

特殊符号也不是轻易能取的出来的,不信自己试试
作者: flyinspace     时间: 2007-3-29 08:01
可以取出来的。。
试过好几个特殊符号都取出来了。。
至于其他的。没工夫试。。
也不想试。。还不如用c++写。
作者: bjsh     时间: 2007-3-29 09:09
你自己试试用引号
作者: bjsh     时间: 2007-3-29 22:37
终于解决了你的问题了;

type 1.txt |shellesc >3.txt


shellesc这东西太好了
作者: bjsh     时间: 2007-3-30 07:17
不借助第三方工具的代码

  Quote:

  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 ]
作者: axi     时间: 2007-3-30 13:21
如果想在批处理中创建多个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 ]
作者: flyinspace     时间: 2007-3-30 13:42


  Quote:
Originally posted by bjsh at 2007-3-28 08:09 PM:
你自己试试用引号

什么意思??
你举个例子先。
作者: bjsh     时间: 2007-3-30 21:07
re axi 兄;那个方法确实妙啊!!!!!

re flyinspace:
还是不要考虑引号了;虽然最后利用解决了;但是还会有新问题;
还是试试下面的代码吧;

  Quote:

  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


作者: peterdocter     时间: 2007-4-1 22:47
还可以用 more 大法来完成楼主的B转V方案这个方法绝!
看到还要可以用到注册表转换功能:)
作者: wuwuwuming     时间: 2007-4-1 23:07
真是汗~~~~~
好厉害,我顶~~~~~~