是否有相当于Windows cmd.exe(或其他XP标准工具)中的“cut -c”?

我有一些固定行大小的文件,我需要从中提取信息的固定字段大小。 否则,我会使用Cygwin( cut等),但这不是一个select,因为(骨头)pipe理政策,我不能改变。 它必须使用Windows附带的标准XP工具集来完成。

我需要提取偏移量为7的10个字符和偏移量为22的4个字符(从零开始),然后将它们输出到一个文件,但略有扭曲:

  • 第一个字段可能有负号,正号或无号(在开始或结束时)。 标志应该移到前面,如果是正面的,则移除标志。
  • 第二个字段应该有前后空格。

例如:

  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< 

Solutions Collecting From Web of "是否有相当于Windows cmd.exe(或其他XP标准工具)中的“cut -c”?"

如果您使用现代Windows,则本地不限于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来完成,但是我会把它留给别人来指导你。

Pax更新:基于这个答案,我想出了以下这将是一个好的开始:

 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和分支(你可以goto :labels批量:labels )。

这东西都很难看,但如果你真的必须去那里…

这里是一个页面在循环中通过文件和做他们的东西: 你如何循环通过使用Windows批处理文件的文本文件中的每一行?

这里有一个小的脚本(需要在BAT / CMD文件中),扩展Daren Thomas的建议:

 @echo off setlocal set key=HKCU\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\{D27CDB6E-AE6D-11CF-96B8-444553540000}\iexplore\AllowedDomains echo. echo list 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因为我只对位于10处的AllowedDomains的子项AllowedDomains

请务必阅读帮助中for /? 。 达仁说得对,当他说这些东西都是相当丑陋的。 而且很容易因修改而中断。 cmd.exe脚本语法有很多不直观的细节。

顺便说一下,GUID是Shockwave Flash插件的COM类ID。 至少从2001年开始,所以在可预见的未来可能会继续保持相关性。 该脚本的目的是列出哪些Flash,我更愿意在默认情况下禁止Flash的域名。