在Powershell中从end结尾提取字符

时间:2016-09-24 11:51:39

标签: powershell

1.txt具有以下内容

abc12345
zyx98765
qwerty$%

我想要的输出

12345
98765
rty$%

Powershell Code

$data = get-content "1.txt"

$charcount = 5;
$output = @()
foreach($line in $data)
{
   if ($line.length -gt 250){ $output += $line.substring($line.length-$charcount, $charcount) } 
}

$output

没有输出。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

要让您的示例正常工作(输出最后5个字符/删除前3个字符),请使用以下代码

$charcount = 5
@'
abc12345
zyx98765
qwerty$%
'@ -split "\r*\n" | ForEach-Object { $_.Substring($_.Length-$charcount) }

让实际的例子正常工作

$charcount = 5
$output = @()
Get-Content "1.txt" | ForEach-Object {
  if ($_.Length -gt 250) {
    $output += $_.substring($_.length-$charcount, $charcount)
  }
  else {
    $output+= $_ #append any line <= 250 chars
  }
}
$charcount

答案 1 :(得分:0)

您的代码存在两个主要问题。

第一个是if声明:

if($line.Length -gt 250) { ... }

您的示例字符串的长度都不超过250个字符,因此不会发生任何事情。

如果删除if语句,最终会得到:

foreach($line in $data)
{
    $output += $line.Substring($line.Length - $charcount, $charcount)
}

这对于您当前的示例非常有用,但如果您传入长度小于$charcount个字符的字符串,则会遇到错误,因为$line.Length - $charcount小于零。< / p>

你可以通过以下方式解决这个问题:

foreach($line in $data)
{
    if($line -ge $charcount) {
        $output += $line.Substring($line.Length - $charcount, $charcount)
    } else {
        # Line is less than $charcount long, return full string
        $output += $line
    }
}

或者,将suggested by PetSerAl复合成一个单一的陈述:

foreach($line in $data)
{
    $output += $line.Substring([Math]::Max($line.Length - $charcount, 0))
}