【问题标题】:Avoiding repeating the same line Powershell避免重复同一行 Powershell
【发布时间】:2018-06-19 10:07:46
【问题描述】:

我有一个文件,它总是在文件的第一行包含主机名,后跟所需的容量:

主机1 10克 1克 2克

我需要从文件中提取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
}

它创建了这个;

HOST1的容量为001 10g 1g 2g HOST1的容量为002 10g 1g 2g HOST1的容量为003 10g 1g 2g

我对 Powershell 很陌生,并且尝试了几个地方来找到解决方案。为新手内容提前道歉!

【问题讨论】:

  • 你能把你的“源”文件的一些行也显示出来吗?
  • 在循环内使用$line,而不是$file
  • 我的源文件显示为帖子顶部,HOST1第一行,2g第二行,3g第三行等
  • 哇 PetSerAl 谢谢你,只是改为 $line 而不是 $file。这让我花了大约 2 周的时间来玩各种虽然真实的 foreach 等,但我什至不认为我有这么简单的错误!

标签: powershell


【解决方案1】:

你可以用这个:

$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

解释:

一般来说,只要您将 $file 更改为 $line,就像 PetSerAl 指出的那样,您所做的就非常接近。更多建议可能是避免两次导入文件(在您的代码中不可见,但您显然必须将文件的第一行导入到$HostName。您可以通过将$file[0]保存到$HostName然后迭代所有第一个元素。

【讨论】:

  • 非常感谢您,非常感谢您,并为我指明了进一步的学习领域。
  • 好的,我将查看数组,因为在我的代码顶部我有: $file = "h:\My Documents\Powershell_Work\Temp\volumes.txt" $Host = Get-内容 $file | Select-Object -first 1 $LineCount = Get-Content $file |Measure-Object -Line
  • 您可以将 ForEach 内容减少到一行 "The capacity of {0} is {1:D3} {2}" -f $Hostname,++$Count,$line
  • 同意,这是一个很好的例子来解释++$Count$Count++之间的区别——我也遇到过
  • 有用的 ScriptingGuy 博客pre and post-incrementing
【解决方案2】:

其他方法:

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

【讨论】:

  • 欣赏解决方案,我已经开始合并 % 而不是 foreach,这是第一篇文章的良好学习日。
【解决方案3】:

作为替代解决方案,这是一个非常适合使用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”,并且相关的操作会捕获主机名以在后续消息中使用。

【讨论】:

  • 这更像是我习惯的 ksh,所以我也会考虑使用这种风格,因为它更熟悉。
猜你喜欢
  • 2018-05-03
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2019-10-08
相关资源
最近更新 更多