我有固定线路的大小一些文件,固定字段的大小,我需要提取信息。 Nornmally,我会使用Cygwin( cut
等),但是,这不是在这种情况下一种选择,由于(愚蠢的)管理政策我不能改变。 它使用包含在Windows XP的标准工具集来完成。
我需要提取10个字符偏移量7个4个字符的偏移量22(从零开始),并且将它们输出到一个文件,但有轻微的扭曲:
- 第一字段可以具有负,正,或无符号(在开始或结束)。 标志应移到前面,或删除完全,如果它是积极的。
- 第二场应该有开头和结尾去掉空格。
例如:
1 2 3 <- ignore (these lines not in file,)
0123456789012345678901234567890123456789 <- ignore ( here only for info.)
xxxxxxx 15.22-yyyyyABCDzzzzzzzzzzz...
xxxxxxx 122.00+yyyyy XX zzzzzzzzzzz...
xxxxxxx 9yyyyyYYY zzzzzzzzzzz...
应产生( <
指示行的结束):
-15.22,ABCD<
122.00,XX<
9,YYY<
如果用现代的窗口工作,你不局限于CMD.EXE命令本身,你可以使用VBScript。 如果您的策略是不是无论是使用VBScript,那么我想你应该解雇你的管理:)
Set objFS=CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file"
Set objFile = objFS.OpenTextFile(strFile)
strFirstLine = objFile.ReadLine
Do Until objFile.AtEndOfStream
strLine= objFile.ReadLine
var1 = Mid(strLine,10) ' do substring from position 10 onwards
' var2 = Mid (strLine,<pos>,<length>) ' get next offset and save to var2
WScript.Echo var1 & var2 ' print them out.
Loop
基本上,“一刀切”的字符串的字符,你可以使用MID()函数。 请看看VBScript中的文件 ,以了解更多信息。
保存上面test.vbs,并在命令行上,做
c:\test> cscript /nologo test.vbs > newfile
当然,“子”也可以用纯cmd.exe的做,但我会留给其他一些人来指导你。
由大同更新:基于这个答案,我想出了这将是一个良好的开端如下:
option explicit
dim objFs, objFile, strLine, value1, value2
if wscript.arguments.count < 1 then
wscript.echo "Usage: process <input-file>"
wscript.quit
end if
set objFs=createObject("Scripting.FileSystemObject")
set objFile = objFs.openTextFile(wscript.arguments.item(0))
do until objFile.atEndOfStream
strLine= objFile.readLine
value1 = trim(mid(strLine, 8, 10))
value2 = trim(mid(strLine, 23, 4))
if right(value1,1) = "-" then value1 = "-" & left(value1,len(value1)-1)
if right(value1,1) = "+" then value1 = left(value1,len(value1)-1)
if left(value1,1) = "+" then value1 = mid(value1,2)
wscript.echo value1 & "," & value2
loop
这符合所有我们的要求。 稍后,我们可以使偏移和长度为命令行参数。
最终更新。
这个网站有关于如何在CMD.EXE子提取一些指针: http://www.dostips.com/DtTipsStringManipulation.php
该网站建议您可以使用
%varname:~2,3%
到标中的变量。 这似乎满足您的需要,但你现在必须得到各行成一个变量。
接下来,你要看看可怕for
循环语法以及if
和分支(你可以转到:labels
批量)。
这东西都是比较难看,但如果你真的去那里...
这里是SO页面上通过文件循环和做的东西对他们说: 使用Windows批处理文件在一个文本文件你如何遍历每一行?
这里有一个小脚本(需要在一个BAT / CMD文件)扩大对什么达人托马斯·建议:
@echo off
setlocal
set key=HKCU\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\{D27CDB6E-AE6D-11CF-96B8-444553540000}\iexplore\AllowedDomains
echo.
echo Liste der fuer Flash im IE zugelassenen Domaenen:
echo =================================================
for /f "usebackq tokens=11 delims=\" %%l in (`call reg query "%key%" /s`) do echo. %%l
echo.
endlocal
for循环的核心部分。 注意在双引号中使用命令改性剂。 我指定tokens=11
,因为我只的子项有兴趣AllowedDomains
,这是在第10位。
请务必阅读在帮助for /?
。 达人是正确的,他说,这东西都是比较难看。 而且很容易分解的修改。 有很多非直观的奥妙与cmd.exe
脚本语法。
顺便说一句,该GUID是的Shockwave Flash COM类ID添加上。 它的出现自至少2001年那么很可能继续成为相关预见的未来。 该脚本的目的是列出在域的Flash,这是我比较喜欢默认阻止 ,已被允许。