如何在PowerShell

时间:2017-04-28 23:57:47

标签: powershell

我想删除数组每行中的剩余文本,包括在第一个句点字符实例之后(即'。')。这是我使用的代码,但我收到此错误:异常调用"子串"用" 2"参数:"长度不能小于零。 参数名称:长度"

    $Textfile = Get-Content "C:\Temp\Text.txt"

    $Textfile | Foreach {
    $Textfile.Substring(1,$Textfile.IndexOf('.'))
    }
    $Textfile | Out-File C:\Temp\Text2.txt

4 个答案:

答案 0 :(得分:2)

尝试这样的事情:

Get-Content myfile.txt | foreach {@($_ -split '\.')[0]}

注意:

  1. foreach一次处理一行文件(但你知道)。
  2. @强制结果为数组,即使只有一个字符串,如果没有点。
  3. $ _引用文件的当前行。
  4. 点前面的反斜杠是Regex中的转义字符
  5. [0]选择数组中的第一项。

答案 1 :(得分:1)

在Foreach循环中,您需要处理当前项insert而不是整个$ Textfile数组。

应该是这样的:

update

请注意,如果遇到没有'的行,您仍可能会收到相同的错误。'

答案 2 :(得分:0)

尝试下一种方法:

$Textfile|Foreach {$_ -replace '(^[^.]*)(.*)','$1'}|Out-File C:\Temp\Text2.txt

......或其他:

$Textfile|
Foreach {if(($p=$_.indexof('.')) -ge 0){$_.substring(0,$p)}else{$_}}|
Out-File C:\Temp\Text2.txt

答案 3 :(得分:0)

我看到的问题是你的$ TextFile变量保存了文件的全部内容,但是你在文件的整个内容中对句点索引调用substring。此外,您从1调用子字符串,而不是0.因此在第二次调用后,您将保证收到该错误。我试图在下面纠正它。

$Textfile = Get-Content "C:\Temp\Text.txt"

$NewFileContents = @($Textfile | Foreach {
    if ($_.IndexOf(".") -eq -1)
    {
        $_
    }
    else
    {
        $_.Substring(0,$_.IndexOf('.'))
    }
}) -Join "`r`n"

$NewFileContents | Out-File C:\Temp\Text2.txt

更多代码说明: 字符串索引从0开始,而不是1.换句话说,第一个字符是0.当你调用$ FileContents.Substring(1)时,每次都删除第一个字符。由于您每次都在变量$ FileContents上调用它,而不是在新文件的行上调用它,因此它一直变短。使用来自foreach循环($ _)的匿名变量,可以获得每行的内容。

我调用($ .IndexOf(“。”) - eq -1)来验证该行是否存在句点。通过在执行子字符串之前检查每行上是否存在句点,我们删除了说$ .Substring(0,-1)的可能性,这会产生不可预测的结果。