2

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

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

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.XXX”。问题是第三个文件总是空的。

我哪里错了?任何帮助是极大的赞赏。

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

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

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

4

4 回答 4

3

尝试这个:

(for /f "tokens=3" %%i in (IPPorts2.txt) do @echo %%i)>IPPorts3.txt
于 2013-04-09T14:20:25.030 回答
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,并不完美,但在结果中手动编辑了几行即可完成这项工作。

于 2015-05-03T23:42:35.947 回答
0
(For /f "tokens=3delims= " %%i in (ipports2.txt) do echo %%i) >ipports3.txt

应该为你做。

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

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

于 2013-04-09T14:24:00.823 回答
0
于 2013-04-11T15:12:14.967 回答