【问题标题】:Batch file to remove first 10 chars from txt file从 txt 文件中删除前 10 个字符的批处理文件
【发布时间】:2013-04-09 14:10:38
【问题描述】:

我正在尝试使用批处理脚本从文本文件中的多行中删除前 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 的文件中。第三个找到其中带有“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”。问题是第三个文件总是空的。

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

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

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

这解决了我的问题。谢谢大家!

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 这实际上增加了输出... C:\WINDOWS\system32>echo IP_172.20.55.15 IP_172.20.55.15
    • 回答自己的问题合法吗?这是我刚刚尝试过的,它奏效了。 for /f "tokens=* delims=" %%c in ('type c:\IPPorts2.txt') do (set LINE=%%c >> c:\IPPorts3.txt echo !LINE:~10!)
    • 1) “增加输出”是什么意思? 2) 是的,您可以回答自己的问题。
    • 是的,乔希,如果您在询问后找到答案,我们鼓励您回答您自己的问题。让它成为一个答案,并接受它。它将帮助下一个有类似问题的人。
    • @Josh:显然你需要抑制命令行的输出。只需将@ECHO OFF 命令放在脚本开头的某处即可。但是,您可以完全避免处理输出文件,请参阅我的回答。
    【解决方案2】:

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

    ...
    20/09/2014 01:23 [DIR] some1
    21/09/2014 02:34 [DIR] some2
    22/09/2014 03:45 [DIR] some3
    2014 年 9 月 23 日 11:22 [目录] some4
    ...
    我们希望它是:
    一些1
    一些2
    一些3
    一些4
    ...

    代码:

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


    在您的情况下,tokens=3,并不完美,但在结果中手动编辑了几行即可完成这项工作。

    【讨论】:

      【解决方案3】:
      (For /f "tokens=3delims= " %%i in (ipports2.txt) do echo %%i) >ipports3.txt
      

      应该为你做。

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

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

      【讨论】:

      • 这实际上增加了输出... C:\WINDOWS\system32>echo IP_172.20.55.15 IP_172.20.55.15
      【解决方案4】:

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

      事实上,可以将它们全部排除在脚本之外,除非您需要保留它们以备历史记录。

      基本上思路是先将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
      )

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

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

      【讨论】:

      • 安德烈,我一定会试一试的。我不喜欢输出文件,但它确实有助于找出我需要查找和删除的文本。现在我知道了,我将应用它,看看会发生什么。感谢分享!
      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 2015-03-03
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多