[批处理]如何使用CMD/PowerShell删除不需要的文本
我已经寻找了一段时间来解决这个问题: 这是文本文件[批处理]如何使用CMD/PowerShell删除不需要的文本,powershell,batch-file,cmd,Powershell,Batch File,Cmd,我已经寻找了一段时间来解决这个问题: 这是文本文件output.txt开头的内容(ofc后面还有许多行服务器名): 我需要一个批处理脚本: 删除此文件的第一行 删除除服务器名以外的其他行中的所有内容 因此,示例的输出将是: 我已使用findstr过期,但未成功。您可以使用-replace操作符删除名称以外的所有内容,使用正则表达式: # Read the file into an array with Get-Content $Lines = Get-Content .\output.txt
output.txt
开头的内容(ofc后面还有许多行服务器名):
我需要一个批处理脚本:
- 删除此文件的第一行
- 删除除服务器名以外的其他行中的所有内容
我已使用findstr过期,但未成功。您可以使用
-replace
操作符删除名称以外的所有内容,使用正则表达式:
# Read the file into an array with Get-Content
$Lines = Get-Content .\output.txt
# Use Where-Object to filter away lines not containing "name:"
$Lines = $Lines |Where-Object {$_ -match 'name:'}
# Use -replace to capture the servername
$Names = $Lines -replace '^\s+?name:\s(\S+);\s*$','$1'
您可以将这些语句组合到单个管道中:
$Names = Get-Content .\output.txt |Where-Object {$_ -match 'name:'} |ForEach-Object {$_ -replace '^\s+?name:\s(\S+);\s*$','$1'}
下面是一个
cmd
解决方案:
for /F "usebackq skip=1 tokens=2 delims=:; " %I in ("output.txt") do echo %I
要将输出写入新文件,例如output\u new.txt
,请使用重定向:
> "output_new.txt" (for /F "usebackq skip=1 tokens=2 delims=:; " %I in ("output.txt") do echo %I)
要在批处理脚本中使用所有这些,请将%
符号加倍:
> "output_new.txt" (for /F "usebackq skip=1 tokens=2 delims=:; " %%I in ("output.txt") do echo %%I)
在命令提示符中键入
for/?
以获取有关使用for/F
解析文本文件的详细信息我喜欢前面的答案,但希望向您展示一种更简单的方法,如果您可以安装WMF/PowerShell版本5
此版本添加了一个超级强大的新工具,名为convertfromstring
。它使用FlashExtract(在Excel中找到)和一个输入示例文件来智能地从任何给定的输入中提取值
如果您想编写一些非常简洁的代码,可以使用这种方法。要制作一个输入示例文件,只需将预期输出复制并粘贴到记事本中
Current query set
name: srv-comms-xx;
name: easrv00xxx;
name: ealxsrv00xxx;
接下来,请注意要选择的值(在本例中为服务器名称)。现在,对于列表中的前几个服务器名称,请使用大括号,即您希望调用此提取值的名称,然后在所需名称的末尾加一个右大括号。这里有一个例子
Current query set
name: {name*:srv-comms-xx};
name: {name*:easrv00xxx};
name: ealxsrv00xxx;
请注意*,它告诉ConvertFrom字符串在每次看到此值时创建新对象
这就是我们的示例文件。现在将它保存在某个地方(在我的示例T:\example.txt中),并使用Convertfrom字符串调用它
Get-Content .\output.txt | ConvertFrom-String -TemplateFile T:\example.txt
输出
name
----
srv-comms-xx
easrv00xxx
ealxsrv00xxx
请注意,我们只提供了两个示例,但是PowerShell非常聪明,能够识别模式并提取最终的服务器名称。即使我们的输入有数千个名称,我们也只需要前三行或前四行的一个示例,就可以为PowerShell提供足够的提示来说明我们想要做什么
如果要刮取文件并只返回服务器名称,只需插入Select-Expand Name,如下所示:
Get-Content .\output.txt | ConvertFrom-String -TemplateFile T:\example.txt |
Select-Object -ExpandProperty Name
美好的这起作用了。谢谢我还有一个问题,我使用了:
$Names | out file-filepath hostnames.txt-append
将数组传输到textfile。它们现在只是用空格隔开。有没有办法在不同的行上设置每个主机文件?所以第一行包含当前查询集
,对吗?以下所有行都以[leading SPACEs+]name:
+空格开头,对吗?如果是这样,请使用以下命令:“output_new.txt”(for/F“usebackq skip=1 tokens=1,*delims=:%I in(“output.txt”)do echo%J)
是的,Mathias R.Jessen提供的解决方案对我有效。哇,这是非常方便的信息。非常感谢!
name
----
srv-comms-xx
easrv00xxx
ealxsrv00xxx
Get-Content .\output.txt | ConvertFrom-String -TemplateFile T:\example.txt |
Select-Object -ExpandProperty Name