我的文件总是包含文件顶行的主机名,后跟所需的容量:
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内容道歉!
答案 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”,并且相关联的操作将捕获主机名,以在后续消息中使用。