我一直在寻找解决此问题的方法:
这是文本文件output.txt
开头的内容(其中有更多服务器名称行):
Current query set name: srv-comms-xx; name: easrv00xxx; name: ealxsrv00xxx;
我需要一个批处理脚本:
删除此文件的第一行
从服务器名
因此示例的输出将是:
srv-comms-xx easrv00xxx ealxsrv00xxx
我使用findstr过期但没有成功。
答案 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
解析文本文件的更多信息。