避免重复同一行Powershell

时间:2018-06-19 10:07:46

标签: powershell

我的文件总是包含文件顶行的主机名,后跟所需的容量:

HOST1
10g
1g
2g

从文件中我需要提取HOST行以构成我想要创建的文本行以及逐行顺序的容量行。它还会根据行数对001行进行编号。

我想得到这样的几行:

The capacity of HOST1 is 001 10g
The capacity of HOST1 is 002 1g
The capacity of HOST1 is 003 2g
etc etc

我尝试使用下面的foreach条件执行此操作,并在此处搜索了如何执行此操作,但这是一个非常定制的问题来描述:(

$file = Get-Content $filename | Select-Object -skip 1 

foreach ($line in $file)
{
$count = $count +1
$FileCount = "{0:D3}" -f $count 
Write-Host "The capacity of $HostName is $FileCount $file
}

虽然创造了这个;

The capacity of HOST1 is 001 10g 1g 2g

The capacity of HOST1 is 002 10g 1g 2g

The capacity of HOST1 is 003 10g 1g 2g

我对Powershell很新,并尝试了几个地方来找到解决方案。为noob内容道歉!

3 个答案:

答案 0 :(得分:2)

你可以用这个:

$file = get-content $filename

$count = 0
$Hostname = $file[0]
foreach ($line in $file[1..$($file.Length-1)]) {
    $count = $count +1
    $FileCount = "{0:D3}" -f $count 
    Write-Host "The capacity of $HostName is $FileCount $line"
}

可以在ForEach中使用的单行(LotPings积分) - 如果您不确定为什么使用++$Count代替$Count++检查this blog post(积分到JamesC。链接):

"The capacity of {0} is {1:D3} {2}" -f $Hostname,++$Count,$line

输出:

  

HOST1的容量为001 10g

     

HOST1的容量为002 1g

     

HOST1的容量为003 2g

说明:

一般来说,如果你按照PetSerAl的指示将$file更改为$line,那么你所做的就非常接近了。更多建议可能是避免两次导入文件(在您的代码中不可见,但您显然必须将文件的第一行导入$HostName。您可以将$file[0]保存到$HostName来执行此操作然后迭代除第一个元素以外的所有元素。

答案 1 :(得分:1)

其他方法:

$N=-1
get-content $filename  | %{ if($N++ -eq -1) {$HST=$_} else {"The capacity of {0} is {1:D3} {2}" -f $HST, $N, $_}}

答案 2 :(得分:0)

作为替代解决方案,这是一个非常适合使用switch语句的问题:

$count = 1
switch -regex -file $filename 
{
    ^HOST {
        $hostName = $_
        continue
    }
    default {
        "The capacity of $hostName is {0:D3} $_" -f $count++
        continue
    }
}

这利用了PowerShell的switch实际上是一个循环这一事实。 -File选项告诉它循环遍历文件中的每一行。正则表达式匹配“ HOST”,并且相关联的操作将捕获主机名,以在后续消息中使用。