Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 从txt文件中删除前10个字符的批处理文件_Windows_Batch File - Fatal编程技术网

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

Windows 从txt文件中删除前10个字符的批处理文件,windows,batch-file,Windows,Batch File,我试图使用批处理脚本从文本文件的多行中删除前10个字符,然后将结果输出到新文件。我跑过去,它给我指出了正确的方向,但最终的输出不起作用 以下是到目前为止我得到的信息: setLocal EnableDelayedExpansion CSCRIPT /nologo %windir%\System32\prnport.vbs -l > c:\IPPorts.txt type c:\IPPorts.txt | findstr IP_ > c:\IPPorts2.txt for /f "to

我试图使用批处理脚本从文本文件的多行中删除前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
第2行将打印机端口列表导出到名为IPPorts.txt的文件中。第三行查找其中包含“IP_3;”的行,并导出到IPPorts2.txt。第四行应该删除不需要的文本(它没有这样做)并导出到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”。问题是第三个文件总是空的

我哪里做错了?非常感谢您的帮助

编辑: 这是在恩多的回答下面,但我想把答案贴在这里可能会更好。以下是我将第四行更改为:

for /f "tokens=* delims=" %%c in ('type c:\IPPorts2.txt') do (
 set LINE=%%c
 >> c:\IPPorts3.txt echo !LINE:~10!
 )
这纠正了我的问题。谢谢大家

试试这个:

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

(for /f "tokens=3" %%i in (IPPorts2.txt) do @echo %%i)>IPPorts3.txt
我应该为你做这件事

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

只需使用分隔符[space]将每行上的字符串标记为token1=
端口
、token2=
名称
,然后依次为每个token3设置%%i

我应该为你做这件事

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


只需使用分隔符[space]将每行上的字符串标记为token1=
端口
,token2=
名称
,然后依次为每个token3设置%%i。

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

事实上,可以将它们全部从脚本中排除,除非您需要将它们保留为历史记录

基本上,首先要将
FINDSTR
直接应用于
prnport.vbs
的输出:

CSCRIPT /nologo %windir%\System32\prnport.vbs -l | FINDSTR "IP_"
并在同一循环中使用另一组参数调用
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=3”%%A IN(
'CSCRIPT/nologo%windir%\System32\prnport.vbs-l^ FINDSTR“IP”'
)做(
CSCRIPT/nologo%windir%\System32\prnport.vbs-d-r%%A
)
FOR/F
循环的
tokens
选项指定基于特定分隔符或一组分隔符使用哪个标记(或字段)。默认的分隔符集是空格、逗号和制表符。您的
端口名IP\u无论什么
行恰好由三个令牌组成,第三个令牌就是您要找的,因此选项中的
“tokens=3”


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

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

事实上,可以将它们全部从脚本中排除,除非您需要将它们保留为历史记录

基本上,首先要将
FINDSTR
直接应用于
prnport.vbs
的输出:

CSCRIPT /nologo %windir%\System32\prnport.vbs -l | FINDSTR "IP_"
并在同一循环中使用另一组参数调用
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=3”%%A IN(
'CSCRIPT/nologo%windir%\System32\prnport.vbs-l^ FINDSTR“IP”'
)做(
CSCRIPT/nologo%windir%\System32\prnport.vbs-d-r%%A
)
FOR/F
循环的
tokens
选项指定基于特定分隔符或一组分隔符使用哪个标记(或字段)。默认的分隔符集是空格、逗号和制表符。您的
端口名IP\u无论什么
行恰好由三个令牌组成,第三个令牌就是您要找的,因此选项中的
“tokens=3”

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

从DIR命令输出中获取目录名的脚本: …
2014年9月20日01:23[DIR]some1
2014年9月21日02:34[DIR]some2
2014年9月22日03:45[DIR]some3
2014年9月23日11:22[DIR]some4

我们希望它是:
有些人1
一些2
一些3
某物4


代码:

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

在您的示例中,tokens=3并不完美,但只需在结果中手动编辑几行即可完成任务。

从DIR命令输出中获取目录名的脚本: …
2014年9月20日01:23[DIR]some1
2014年9月21日02:34[DIR]some2
2014年9月22日03:45[DIR]some3
2014年9月23日11:22[DIR]some4

我们希望它是:
有些人1
一些2
一些3
某物4


代码:

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


在您的例子中,tokens=3,并不完美,但在结果中手动编辑几行就可以完成任务。

这实际上增加了输出。。。C:\WINDOWS\system32>echo IP_172.20.55.15 IP_172.20.55.15回答自己的问题合法吗?这是我刚刚尝试过的,它成功了。对于/f“tokens=*delims=“%%c in('type c:\IPPorts2.txt')do(set LINE=%%c>>c:\IPPorts3.txt echo!LINE:~10!)1)“增加输出”是什么意思??2) 是的,你可以回答你自己的问题。是的,Josh,如果你在提问后找到答案,我们鼓励你回答你自己的问题。做一个回答,并接受它。这将有助于下一个人回答类似的问题。@Josh:显然你需要抑制命令行的输出。只需将
@ECHO OFF
命令放在beg的某个位置