在PowerShell中创建多个文本文件并从其他文件添加数据

时间:2019-02-25 05:35:26

标签: powershell

我有一个原始文本文件,其中包含需要复制到另一个文件的数据块,并且每个数据块都必须位于一个新文件中。

这是数据块

HOST 123...

TEST ...

IP...

DONE...

HOST 123...

TEST ...

IP...

DONE...

在读取原始文本文件之后,想要在HOSTDONE之间复制该块并将其粘贴到新文件,并且每次找到该块时,都将数据粘贴到另一个文件中。

最后,它应该是多个文件,上面有数据块。

到目前为止,我有以下内容:

$flag = 0 Get-Content file.txt
Get-Content
for each {Switch -Wildcard($_)
{"HOST" {$flag = 1} "DONE" {$flag = 0}}
if ($flag -eq 1){Out-File out.txt -InputObjects $_ -Append}}

1 个答案:

答案 0 :(得分:0)

我确信有更好的方法来执行此操作,但这对于提取HOSTDONE行之外的块应该有效:

$FileContents = Get-Content file.txt
$HostLines = ($FileContents | Select-String -Pattern "^HOST.*$" -AllMatches -CaseSensitive).linenumber
$DoneLines = ($FileContents | Select-String -Pattern "^DONE.*$" -AllMatches -CaseSensitive).linenumber

for ($i = 0; $i -lt $HostLines.count; $i++) {
    $FileContents[($HostLines[$i])..($DoneLines[$i]-2)] | out-file -FilePath ("File" + $i + ".txt")
}

上面的代码会将您的代码块提取到以File0.txtFile1.txt等开头的文件中。显然,在某些情况下,如果您有其他以{开头的行{1}}或您打算包含的HOST

要包含DONEHOST行:

DONE

循环根据$FileContents = Get-Content file.txt $HostLines = ($FileContents | Select-String -Pattern "^HOST.*$" -AllMatches -CaseSensitive).linenumber $DoneLines = ($FileContents | Select-String -Pattern "^DONE.*$" -AllMatches -CaseSensitive).linenumber for ($i = 0; $i -lt $HostLines.count; $i++) { $FileContents[($HostLines[$i]-1)..($DoneLines[$i]-1)] | out-file -FilePath ("File" + $i + ".txt") } $HostLines内容的准确性而工作。这两个变量分配都是在搜索文本文件后显示行号的结果。 $DoneLines包含一个以$HostLines开头的每个行号的数组。 HOST包含一个以$DoneLines开头的每个行号的数组。 for循环使用DONE在数组的每个元素中递增。 $i返回数组索引$HostLines[$i]处的值。该值是行号。 $i从行号中减去一个,因为$HostLines[$i]-1也是一个数组。数组索引从0而不是1开始。因此,如果要第3行,则需要$FileContents$FileContents[2]索引包含范围运算符[1..4]。这将返回索引1,2、3和4的所有值。

以下是访问数组值的示例:

(..)