我想删除数组每行中的剩余文本,包括在第一个句点字符实例之后(即'。')。这是我使用的代码,但我收到此错误:异常调用"子串"用" 2"参数:"长度不能小于零。 参数名称:长度"
$Textfile = Get-Content "C:\Temp\Text.txt"
$Textfile | Foreach {
$Textfile.Substring(1,$Textfile.IndexOf('.'))
}
$Textfile | Out-File C:\Temp\Text2.txt
答案 0 :(得分:2)
尝试这样的事情:
Get-Content myfile.txt | foreach {@($_ -split '\.')[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)的可能性,这会产生不可预测的结果。