[批处理]如何使用CMD / PowerShell删除不需要的文本

时间:2015-11-25 10:45:45

标签: powershell batch-file cmd

我一直在寻找解决此问题的方法: 这是文本文件output.txt开头的内容(其中有更多服务器名称行):

Current query set
                    name: srv-comms-xx;
                    name: easrv00xxx;
                    name: ealxsrv00xxx;

我需要一个批处理脚本:

  • 删除此文件的第一行

  • 从服务器名

  • 以外的其他行中删除所有内容

因此示例的输出将是:

srv-comms-xx
easrv00xxx
ealxsrv00xxx

我使用findstr过期但没有成功。

3 个答案:

答案 0 :(得分:1)

您可以使用-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'}

答案 1 :(得分:1)

我喜欢之前的答案,但如果您可以安装WMF / PowerShell版本5,我想向您展示一种更简单的方法。

此版本添加了一个名为ConvertFrom-String的超级强大的新工具。这使用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-String每次看到这个值时都会创建新对象。

那就是我们的示例文件。现在将它保存在某处(在我的示例中为T:\ Example.txt),并使用Convertfrom-String调用它。

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

答案 2 :(得分:0)

以下是cmd解决方案:

for /F "usebackq skip=1 tokens=2 delims=:; " %I in ("output.txt") do echo %I

要将输出写入新文件,例如output_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解析文本文件的更多信息。