批处理文件从txt文件中删除前10个字符

时间:2013-04-09 14:10:38

标签: windows batch-file

我正在尝试使用批处理脚本从文本文件中的多行中删除前10个字符,然后将结果输出到新文件。我跑过this,它让我指向正确的方向,但最后的输出不起作用。

这是我到目前为止所得到的:

setLocal EnableDelayedExpansion
CSCRIPT /nologo %windir%\System32\prnport.vbs -l > c:\IPPorts.txt
type c:\IPPorts.txt | findstr IP_ > c:\IPPorts2.txt
for /f "tokens=*" %%a in (c:\IPPorts2.txt) do (set line=%%a set chars=!line:~10! > c:\IPPorts3.txt)
for /f "delims=" %%x in (c:\IPPorts3.txt) do CSCRIPT /nologo %windir%\System32\prnport.vbs -d -r %%x

第二行将打印机端口列表导出到名为IPPorts.txt的文件中。第3个查找其中包含“IP_”的行并导出到IPPorts2.txt。第4行应该删除不需要的文本(它没有这样做)并导出到IPPorts3.txt。最后一行将从IPPorts3.txt获取结果,然后删除这些端口。

IPPorts.txt如下:

Server name 
Port name IP_172.20.51.11
Host address 172.20.51.11
Protocol RAW
Port number 9100
SNMP Disabled

每个端口都会重复这些行,其中有几个。由于我只需要包含端口名称的行,因此IPPorts2.txt如下所示:

Port name IP_172.20.51.11
Port name IP_172.20.52.58
Port name IP_172.20.53.16
Port name IP_172.20.54.19
Port name IP_172.20.55.15-1
Port name IP_172.20.55.15
Port name IP_172.20.55.11

我遇到问题的方法是删除行的“端口名称”部分(前10个字符)。我希望输出在每一行读取为“IP_X.X.X.X”。问题是第3个文件总是空的。

我哪里错了?非常感谢任何帮助。

编辑: 在Endoro的答案下,这是进一步下来,但我认为在这里发布答案可能会很好。以下是我将第4行更改为:

for /f "tokens=* delims=" %%c in ('type c:\IPPorts2.txt') do (
 set LINE=%%c
 >> c:\IPPorts3.txt echo !LINE:~10!
 )

这已经纠正了我的问题。谢谢大家!

4 个答案:

答案 0 :(得分:3)

试试这个:

(for /f "tokens=3" %%i in (IPPorts2.txt) do @echo %%i)>IPPorts3.txt

答案 1 :(得分:1)

从DIR命令输出中获取目录名的脚本:

...
20/09/2014 01:23 [DIR] some1
21/09/2014 02:34 [DIR] some2
22/09/2014 03:45 [DIR] some3
23/09/2014 11:22 [DIR] some4
...
我们希望它是:
some1
some2
some3
some4
...

代码:

@FOR /f "tokens=4" %%D IN (i:\test.txt) DO @( echo %%D ) >> result.txt


在您的情况下,令牌= 3,不完美,但在结果中手动编辑的线数很少。

答案 2 :(得分:0)

(For /f "tokens=3delims= " %%i in (ipports2.txt) do echo %%i) >ipports3.txt

应该为你做。

paretheses很重要 - 确保重新创建文件。如果省略,则只生成最后一行。

只需使用分隔符[space]将每行上的字符串标记为token1 = Port,token2 = Name并依次将%% i设置为每个token3。

答案 3 :(得分:0)

以下并不是一个真正不同的解决方案,而只是通过减少输出文件数量来简化脚本的建议。

事实上,可以从脚本中排除所有这些内容,除非您需要将它们保留在历史记录中。

基本上,我们的想法是首先将FINDSTR直接应用于prnport.vbs的输出:

CSCRIPT /nologo %windir%\System32\prnport.vbs -l | FINDSTR "IP_"

然后直接将循环应用于FINDSTR的输出(注意管道命令行周围的单引号,以及转义的|):

FOR /F "tokens=3" %%A IN (
  'CSCRIPT /nologo %windir%\System32\prnport.vbs -l ^| FINDSTR "IP_"'
) DO …

并在同一个循环中使用另一组参数调用prnport.vbs

FOR /F "tokens=3" %%A IN (
  'CSCRIPT /nologo %windir%\System32\prnport.vbs -l ^| FINDSTR "IP_"'
) DO (
  CSCRIPT /nologo %windir%\System32\prnport.vbs -d -r %%A
)

tokens循环的FOR /F选项根据特定分隔符或分隔符集指定要采用的标记(或字段)。默认的分隔符集是空格,逗号,制表符。您的Port name IP_whatever行方便地由三个令牌组成,第三个是你所追求的,因此在选项中"tokens=3"

因此,正如您所看到的,没有输出文件,必要的值被提取并在同一次迭代中传递给目标命令