Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
[批处理]如何使用CMD/PowerShell删除不需要的文本_Powershell_Batch File_Cmd - Fatal编程技术网

[批处理]如何使用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