[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理echo怎样输出临时文件?

RT
想在批处理里面生成一个临时的VBS文件,文件的内容也想通过批处理的echo(或其他)命令,写到那个临时的文件里面,有什么办法解决呢?
最好不要是下面这样的哦
echo strComputer = ".">1.vbs
echo Set objWMIService = GetObject("winmgmts:" _ >>1.vbs
。。。

有没有一次性输出的方法啊?
例如
echo strComputer = "."
         Set objWMIService = GetObject("winmgmts:" _
         。。。
         >1.vbs

急等,请指教。

请帮帮忙忙吧

TOP

为什么要用 echo 呢?
  1. @echo off
  2. more +4<"%0">1.vbs
  3. exit
  4. ::下面为要输出内容的原文
  5. 1
  6. 2
  7. 3
复制代码
注意more +后的数字,要根据实际情况修改
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

有好几种办法的。
方案1:括号
(echo strComputer = "."
echo Set objWMIService = GetObject("winmgmts:" _
echo 。。。)>1.vbs
方案2:转义(需要特殊的文本编辑器才成,如edit)
echo strComputer = "." ^
Set objWMIService = GetObject("winmgmts:" _  ^
。。。>1.vbs
方案3:预处理
set a=strComputer = "."¥Set objWMIService = GetObject("winmgmts:" _¥。。。
echo %a:¥=&echo % >1.vbs
方案4:16进制(推荐,无视任何CMD特殊字符)
使用COM2DEBUG将预先写好的VBS文件转换为一段代码(内含VBS的16进制值)
在CMD内执行这段代码自动生成原VBS文件
(优点:源文件是exe也能还原出来的)(缺点:生成代码翻倍,源文件必须小于2KB,若大于2KB改用EXE2debug)

COM2DEBUG为是SYXQ.COM定制的打包工具,我自己写的需要的话找我QQ:354324773
-----------------------------------------------------------------------------------------
以下是COM2DEBUG,将生成的CMD文件代码复制到你的代码的合适位置即可
  1. @echo off&SETLOCAL ENABLEDELAYEDEXPANSION&color 3e&(CHCP 437 &GRAFTABL 936)>NUL
  2. (echo.q)|DEBUG>NUL
  3. title SYBN DW16  任意文件 转换至 CMD代码(DW方式输出DENUG) V0.31
  4. echo ╔━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╗
  5. echo ┃  SYBN DW16  任意文件 转换至 CMD代码(DW方式输出DENUG) V0.3  ┃
  6. echo ╟──────────────────────────────╢
  7. echo ┃支持任意小于2.5KB(小于2500字节)的文件,原文件名要符合8.3规则 ┃
  8. echo ┃转换后,会生成一个cmd脚本. 该脚本执行后,自动会生成原来的文件 ┃
  9. echo ┃本脚本使用DW格式输出,相比DB格式节约大量代码,且只生成4行脚本 ┃
  10. echo ┃本脚本及生成脚本不支持DOS下运行,如有特殊需要请给我的QQ留言  ┃
  11. echo ┃[SYBN] QQ:354324773 2010-3-31       最初用于转换生成SYBC.COM┃
  12. echo ╚━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╝
  13. :1
  14. ::获取文件
  15. set p=SYBC.COM
  16. set /p p=请输入要转换的文件名(如:SYBC.COM)?
  17. ::验证文件
  18. if not exist %p% echo 文件不存在.&&goto :1
  19. set p2=%P:"=%
  20. if "%p2:~-4,4%" == ".exe" set YS=1
  21. set p2=%p:~0,-1%_
  22. ren %p% %p2%
  23. set /p a=转换中...<NUL
  24. ::删除临时文件
  25. if exist debugtmp.txt del debugtmp.txt
  26. if exist debugtmp2.txt del debugtmp2.txt
  27. ::内存清零--------载入文件----------获取16进制数据----------获取文件大小---退出----传递给DEBUG-返回数据到debugtmp.txt文件
  28. (echo.f 100 ffff 00 &echo.n %p2%&echo.l&echo.d100 D00&echo.rcx&echo.&echo.q)|debug >debugtmp.txt
  29. ren %P2% %p%
  30. ::提取debugtmp.txt中的有效数据到debugtmp2.txt
  31. for /f "delims=- tokens=1,*" %%a in (debugtmp.txt) do if not "%%b" == "" echo %%a %%b >>debugtmp2.txt
  32. ::提取debugtmp.txt中的文件长度数据到变量RCX(4位16进制)
  33. for /f "tokens=1,*" %%a in (debugtmp.txt) do if "%%a" == "CX" set RCX=%%b
  34. ::提取debugtmp2.txt中的数据转换为DW格式,保存到变量c,用`号分隔行
  35. for /f "tokens=2-17" %%a in (debugtmp2.txt) do (
  36. if "%%b%%a %%d%%c %%f%%e %%h%%g %%j%%i %%l%%k %%n%%m %%p%%o" == "0000 0000 0000 0000 0000 0000 0000 0000" goto :1.1
  37. set c=!c!`%%b%%a %%d%%c %%f%%e %%h%%g %%j%%i %%l%%k %%n%%m %%p%%o
  38. )
  39. :1.1
  40. set c=%c%``
  41. ::压缩数据,去除16进制开头的0
  42. set c=%c: 0= %
  43. set c=%c: 0= %
  44. set c=%c: 0= %
  45. set c=%c:`0=`%
  46. set c=%c:`0=`%
  47. set c=%c:`0=`%
  48. :2
  49. goto :3
  50. ::压缩数据,去除无意义的数据结尾
  51. set c=%c: 0``=``%
  52. set c=%c: 0``=``%
  53. set c=%c: 0``=``%
  54. set c=%c: 0``=``%
  55. set c=%c: 0``=``%
  56. set c=%c: 0``=``%
  57. set c=%c: 0``=``%
  58. :3
  59. ::生成目标脚本
  60. echo @echo off^&SETLOCAL ENABLEDELAYEDEXPANSION^&(CHCP 437^&GRAFTABL 936)^>NUL>%p%.cmd
  61. echo SET SYBCOM=A100`%c%>>%p%.cmd
  62. echo SET V=`RCX`%RCX%`N %p%`W`Q>>%p%.cmd
  63. echo (ECHO.f100 ffff 00`^&echo.%%SYBCOM:`=^&ECHO.DW %%^&ECHO.%%V:`=^&ECHO.%%)^|DEBUG^>NUL>>%p%.cmd
  64. if "%YS%" == "1" echo REN %P2% %p%>>%p%.cmd>>%p%.cmd
  65. ::显示完成信息
  66. echo 转完成.  [文件大小:%RCX%H]  [文件名:%P%.cmd]
  67. pause>NUL
复制代码

[ 本帖最后由 sybnwork 于 2010-12-7 18:54 编辑 ]

TOP

原帖由 hanyeguxing 于 2010-12-7 18:34 发表
为什么要用 echo 呢?@echo off
more +41.vbs
exit
::下面为要输出内容的原文
1
2
3注意more +后的数字,要根据实际情况修改



试过了你的这个方法,在单独的脚本里面确实可以用,但是我是想把这个输出文件作为一个单独的函数,当使用call是,%0就被替换成当前函数的名字了。
这个问题有没有什么办法解决啊?

TOP

@echo off
call :echo_vbs
goto :EOF

:echo_vbs
more +4<"%0">1.vbs
exit
::下面为要输出内容的原文
1
2
3
上面的这个情况,"%0"就会被替换为echo_vbs了

TOP

我要写的vbs代码如下,就是想在一个批处理中把这段代码输出到一个临时的VBS文件里面,然后,再在这个批处理文件里面调用这个VBS。
当然输出到VBS的处理最好是在一个单独的函数里面比较好。
  1. 'Script File Name: DiskMonitor.vbs
  2. strComputer = "."
  3. Set objWMIService = GetObject("winmgmts:" _
  4.    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
  5. set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
  6. Set colDisks = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSet
  7. If Wscript.Arguments.Count = 0 Then
  8. objRefresher.Refresh
  9. For Each objDisk in colDisks
  10.    Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSec
  11. Next
  12. End If
  13. If Wscript.Arguments.Count = 1 Then
  14. Interval = CInt(Wscript.Arguments(0)) * 1000
  15. Do While True
  16.    objRefresher.Refresh
  17.    Wscript.Echo
  18.    Wscript.Echo "Time: " & " " & Time()
  19.    Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr("    kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)
  20.    For Each objDisk in colDisks
  21.     Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1)
  22.    Next
  23.    Wscript.Sleep Interval
  24. Loop
  25. End If
  26. If Wscript.Arguments.Count = 2 Then
  27. i = 0
  28. Interval = CInt(Wscript.Arguments(0)) * 1000
  29. Count = CInt(Wscript.Arguments(1))
  30. Do While i < Count
  31.    objRefresher.Refresh
  32.    Wscript.Echo
  33.    Wscript.Echo "Time: " & " " & Time()
  34.    Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr("    kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)
  35.    For Each objDisk in colDisks
  36.     Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1)
  37.    Next
  38.    Wscript.Sleep Interval
  39.    i = i + 1
  40. Loop
  41. End If
  42. Function FormatStr(str, tLen, direction)
  43. sLen = Len(str)
  44. fStr = ""
  45. num = tLen - sLen
  46. j = 0
  47. Do While j < num
  48.    fStr = fStr & " "
  49.    j = j + 1
  50. Loop
  51. If direction = 1 Then
  52.    fStr = fStr & str
  53. Else
  54.    fStr = str & fStr
  55. End If
  56. FormatStr = fStr
  57. End Function
复制代码

[ 本帖最后由 mooninclouds 于 2010-12-7 20:44 编辑 ]

TOP

  1. @echo off
  2. more +5<"%0">hanye.vbs
  3. cscript //nologo hanye.vbs
  4. del hanye.vbs
  5. exit
  6. 'Script File Name: DiskMonitor.vbs
  7. strComputer = "."
  8. Set objWMIService = GetObject("winmgmts:" _
  9.    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
  10. set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
  11. Set colDisks = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSet
  12. If Wscript.Arguments.Count = 0 Then
  13. objRefresher.Refresh
  14. For Each objDisk in colDisks
  15.    Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSec
  16. Next
  17. End If
  18. If Wscript.Arguments.Count = 1 Then
  19. Interval = CInt(Wscript.Arguments(0)) * 1000
  20. Do While True
  21.    objRefresher.Refresh
  22.    Wscript.Echo
  23.    Wscript.Echo "Time: " & " " & Time()
  24.    Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr("    kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)
  25.    For Each objDisk in colDisks
  26.     Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1)
  27.    Next
  28.    Wscript.Sleep Interval
  29. Loop
  30. End If
  31. If Wscript.Arguments.Count = 2 Then
  32. i = 0
  33. Interval = CInt(Wscript.Arguments(0)) * 1000
  34. Count = CInt(Wscript.Arguments(1))
  35. Do While i < Count
  36.    objRefresher.Refresh
  37.    Wscript.Echo
  38.    Wscript.Echo "Time: " & " " & Time()
  39.    Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr("    kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)
  40.    For Each objDisk in colDisks
  41.     Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1)
  42.    Next
  43.    Wscript.Sleep Interval
  44.    i = i + 1
  45. Loop
  46. End If
  47. Function FormatStr(str, tLen, direction)
  48. sLen = Len(str)
  49. fStr = ""
  50. num = tLen - sLen
  51. j = 0
  52. Do While j < num
  53.    fStr = fStr & " "
  54.    j = j + 1
  55. Loop
  56. If direction = 1 Then
  57.    fStr = fStr & str
  58. Else
  59.    fStr = str & fStr
  60. End If
  61. FormatStr = fStr
  62. End Function
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 7楼 的帖子

请把完整需求更新到顶楼
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表