标题: [文件操作] 批处理echo怎样输出临时文件? [打印本页]
作者: mooninclouds 时间: 2010-12-7 18:09 标题: 批处理echo怎样输出临时文件?
RT
想在批处理里面生成一个临时的VBS文件,文件的内容也想通过批处理的echo(或其他)命令,写到那个临时的文件里面,有什么办法解决呢?
最好不要是下面这样的哦
echo strComputer = ".">1.vbs
echo Set objWMIService = GetObject("winmgmts:" _ >>1.vbs
。。。
有没有一次性输出的方法啊?
例如
echo strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
。。。
>1.vbs
急等,请指教。
作者: mooninclouds 时间: 2010-12-7 18:33
请帮帮忙忙吧
作者: hanyeguxing 时间: 2010-12-7 18:34
为什么要用 echo 呢?- @echo off
- more +4<"%0">1.vbs
- exit
- ::下面为要输出内容的原文
- 1
- 2
- 3
复制代码
注意more +后的数字,要根据实际情况修改
作者: sybnwork 时间: 2010-12-7 18:52
有好几种办法的。
方案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文件代码复制到你的代码的合适位置即可-
- @echo off&SETLOCAL ENABLEDELAYEDEXPANSION&color 3e&(CHCP 437 &GRAFTABL 936)>NUL
- (echo.q)|DEBUG>NUL
- title SYBN DW16 任意文件 转换至 CMD代码(DW方式输出DENUG) V0.31
- echo ╔━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╗
- echo ┃ SYBN DW16 任意文件 转换至 CMD代码(DW方式输出DENUG) V0.3 ┃
- echo ╟──────────────────────────────╢
- echo ┃支持任意小于2.5KB(小于2500字节)的文件,原文件名要符合8.3规则 ┃
- echo ┃转换后,会生成一个cmd脚本. 该脚本执行后,自动会生成原来的文件 ┃
- echo ┃本脚本使用DW格式输出,相比DB格式节约大量代码,且只生成4行脚本 ┃
- echo ┃本脚本及生成脚本不支持DOS下运行,如有特殊需要请给我的QQ留言 ┃
- echo ┃[SYBN] QQ:354324773 2010-3-31 最初用于转换生成SYBC.COM┃
- echo ╚━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╝
- :1
- ::获取文件
- set p=SYBC.COM
- set /p p=请输入要转换的文件名(如:SYBC.COM)?
- ::验证文件
- if not exist %p% echo 文件不存在.&&goto :1
- set p2=%P:"=%
- if "%p2:~-4,4%" == ".exe" set YS=1
- set p2=%p:~0,-1%_
- ren %p% %p2%
- set /p a=转换中...<NUL
- ::删除临时文件
- if exist debugtmp.txt del debugtmp.txt
- if exist debugtmp2.txt del debugtmp2.txt
- ::内存清零--------载入文件----------获取16进制数据----------获取文件大小---退出----传递给DEBUG-返回数据到debugtmp.txt文件
- (echo.f 100 ffff 00 &echo.n %p2%&echo.l&echo.d100 D00&echo.rcx&echo.&echo.q)|debug >debugtmp.txt
- ren %P2% %p%
- ::提取debugtmp.txt中的有效数据到debugtmp2.txt
- for /f "delims=- tokens=1,*" %%a in (debugtmp.txt) do if not "%%b" == "" echo %%a %%b >>debugtmp2.txt
- ::提取debugtmp.txt中的文件长度数据到变量RCX(4位16进制)
- for /f "tokens=1,*" %%a in (debugtmp.txt) do if "%%a" == "CX" set RCX=%%b
- ::提取debugtmp2.txt中的数据转换为DW格式,保存到变量c,用`号分隔行
- for /f "tokens=2-17" %%a in (debugtmp2.txt) do (
- 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
- set c=!c!`%%b%%a %%d%%c %%f%%e %%h%%g %%j%%i %%l%%k %%n%%m %%p%%o
- )
- :1.1
- set c=%c%``
- ::压缩数据,去除16进制开头的0
- set c=%c: 0= %
- set c=%c: 0= %
- set c=%c: 0= %
- set c=%c:`0=`%
- set c=%c:`0=`%
- set c=%c:`0=`%
- :2
- goto :3
- ::压缩数据,去除无意义的数据结尾
- set c=%c: 0``=``%
- set c=%c: 0``=``%
- set c=%c: 0``=``%
- set c=%c: 0``=``%
- set c=%c: 0``=``%
- set c=%c: 0``=``%
- set c=%c: 0``=``%
- :3
- ::生成目标脚本
- echo @echo off^&SETLOCAL ENABLEDELAYEDEXPANSION^&(CHCP 437^&GRAFTABL 936)^>NUL>%p%.cmd
- echo SET SYBCOM=A100`%c%>>%p%.cmd
- echo SET V=`RCX`%RCX%`N %p%`W`Q>>%p%.cmd
- echo (ECHO.f100 ffff 00`^&echo.%%SYBCOM:`=^&ECHO.DW %%^&ECHO.%%V:`=^&ECHO.%%)^|DEBUG^>NUL>>%p%.cmd
- if "%YS%" == "1" echo REN %P2% %p%>>%p%.cmd>>%p%.cmd
- ::显示完成信息
- echo 转完成. [文件大小:%RCX%H] [文件名:%P%.cmd]
- pause>NUL
复制代码
[ 本帖最后由 sybnwork 于 2010-12-7 18:54 编辑 ]
作者: mooninclouds 时间: 2010-12-7 20:36
原帖由 hanyeguxing 于 2010-12-7 18:34 发表
为什么要用 echo 呢?@echo off
more +41.vbs
exit
::下面为要输出内容的原文
1
2
3注意more +后的数字,要根据实际情况修改
试过了你的这个方法,在单独的脚本里面确实可以用,但是我是想把这个输出文件作为一个单独的函数,当使用call是,%0就被替换成当前函数的名字了。
这个问题有没有什么办法解决啊?
作者: mooninclouds 时间: 2010-12-7 20:40
@echo off
call :echo_vbs
goto :EOF
:echo_vbs
more +4<"%0">1.vbs
exit
::下面为要输出内容的原文
1
2
3
上面的这个情况,"%0"就会被替换为echo_vbs了
作者: mooninclouds 时间: 2010-12-7 20:42
我要写的vbs代码如下,就是想在一个批处理中把这段代码输出到一个临时的VBS文件里面,然后,再在这个批处理文件里面调用这个VBS。
当然输出到VBS的处理最好是在一个单独的函数里面比较好。
-
- 'Script File Name: DiskMonitor.vbs
- strComputer = "."
- Set objWMIService = GetObject("winmgmts:" _
- & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
- set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
- Set colDisks = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSet
- If Wscript.Arguments.Count = 0 Then
- objRefresher.Refresh
- For Each objDisk in colDisks
- Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSec
- Next
- End If
- If Wscript.Arguments.Count = 1 Then
- Interval = CInt(Wscript.Arguments(0)) * 1000
- Do While True
- objRefresher.Refresh
- Wscript.Echo
- Wscript.Echo "Time: " & " " & Time()
- 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)
- For Each objDisk in colDisks
- 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)
- Next
- Wscript.Sleep Interval
- Loop
- End If
- If Wscript.Arguments.Count = 2 Then
- i = 0
- Interval = CInt(Wscript.Arguments(0)) * 1000
- Count = CInt(Wscript.Arguments(1))
- Do While i < Count
- objRefresher.Refresh
- Wscript.Echo
- Wscript.Echo "Time: " & " " & Time()
- 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)
- For Each objDisk in colDisks
- 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)
- Next
- Wscript.Sleep Interval
- i = i + 1
- Loop
- End If
- Function FormatStr(str, tLen, direction)
- sLen = Len(str)
- fStr = ""
- num = tLen - sLen
- j = 0
- Do While j < num
- fStr = fStr & " "
- j = j + 1
- Loop
- If direction = 1 Then
- fStr = fStr & str
- Else
- fStr = str & fStr
- End If
- FormatStr = fStr
- End Function
复制代码
[ 本帖最后由 mooninclouds 于 2010-12-7 20:44 编辑 ]
作者: hanyeguxing 时间: 2010-12-7 20:55
- @echo off
- more +5<"%0">hanye.vbs
- cscript //nologo hanye.vbs
- del hanye.vbs
- exit
- 'Script File Name: DiskMonitor.vbs
- strComputer = "."
- Set objWMIService = GetObject("winmgmts:" _
- & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
- set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
- Set colDisks = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSet
- If Wscript.Arguments.Count = 0 Then
- objRefresher.Refresh
- For Each objDisk in colDisks
- Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSec
- Next
- End If
- If Wscript.Arguments.Count = 1 Then
- Interval = CInt(Wscript.Arguments(0)) * 1000
- Do While True
- objRefresher.Refresh
- Wscript.Echo
- Wscript.Echo "Time: " & " " & Time()
- 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)
- For Each objDisk in colDisks
- 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)
- Next
- Wscript.Sleep Interval
- Loop
- End If
- If Wscript.Arguments.Count = 2 Then
- i = 0
- Interval = CInt(Wscript.Arguments(0)) * 1000
- Count = CInt(Wscript.Arguments(1))
- Do While i < Count
- objRefresher.Refresh
- Wscript.Echo
- Wscript.Echo "Time: " & " " & Time()
- 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)
- For Each objDisk in colDisks
- 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)
- Next
- Wscript.Sleep Interval
- i = i + 1
- Loop
- End If
- Function FormatStr(str, tLen, direction)
- sLen = Len(str)
- fStr = ""
- num = tLen - sLen
- j = 0
- Do While j < num
- fStr = fStr & " "
- j = j + 1
- Loop
- If direction = 1 Then
- fStr = fStr & str
- Else
- fStr = str & fStr
- End If
- FormatStr = fStr
- End Function
复制代码
作者: Batcher 时间: 2010-12-7 21:56 标题: 回复 7楼 的帖子
请把完整需求更新到顶楼
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |