Windows cmd.exe中是否存在“cut -c”的等价物?

时间:2009-10-14 06:15:23

标签: windows cmd

我有一些固定行大小的文件,我需要从中提取信息的固定字段大小。非常,我会使用Cygwin(cut等),但在这种情况下,由于(骨头)管理策略我无法改变,因此不是一种选择。 使用Windows附带的标准XP工具集完成。

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

  • 第一个字段可能有负号,正号或无号(在开头或结尾)。标志应该移到前面,如果是正面则完全移除。
  • 第二个字段应删除前导和尾随空格。

例如:

          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<

3 个答案:

答案 0 :(得分:7)

如果使用现代窗口,本机不限于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 documentation以了解详情。

将上述内容保存为test.vbs,并在命令行中执行

c:\test> cscript /nologo test.vbs > newfile

当然,“substring”也可以使用纯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

这符合我们的所有要求。我们可以稍后将偏移量和长度转换为命令行参数。

结束更新。

答案 1 :(得分:5)

此站点有一些关于如何在cmd.exe中提取子字符串的指示:http://www.dostips.com/DtTipsStringManipulation.php

该网站建议您可以使用

%varname:~2,3%

下标一个变量。这似乎满足了您的需求,除非您现在必须将每一行都变为变量。

接下来,您要查看可怕的for循环语法和if以及分支(您可以批量转到:labels)。

这些东西都很难看,但如果你真的要去那里......

这是SO中的一个页面,用于循环浏览文件并对其执行操作:How do you loop through each line in a text file using a windows batch file?

答案 2 :(得分:2)

这是一个小脚本(需要在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 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 Add-on的COM类ID。这是been around since at least 2001因此可能在可预见的未来继续相关。该脚本的目的是列出允许Flash, which I prefer to block by default的域。