Это происходит потому, что вы делаете конкатенацию строк.
$newLine = ""
$newLine += $line
# result is exactly how it looks,
# "" -> "line1" -> "line1line2" -> "line1line2line3" ...
Простое решение - использовать массив:
$newLine = @()
$newLine += $line
# result is adding lines to an array
# @() -> @("line1") -> @("line1","line2") -> @("line1","line2","line3") ...
но правильный способ PowerShell - это вовсе не делать это, а направлять файл через ваш код в другой файл:
$user = 'User2'
$file = Get-Content c:\datei.txt
foreach($line in $file){
if($line -match $User){
}else{
$line # send the line to the output pipeline
}
} | Out-File c:\datei.txt
Но вы можете инвертировать тест -match
в -notmatch
и избавиться от пустой части {}
.
$user = 'User2'
$file = Get-Content c:\datei.txt
foreach($line in $file){
if($line -notmatch $User){
$line # send the line to the output pipeline
}
} | Out-File c:\datei.txt
И вы можете избавиться от временного хранения содержимого файла:
$user = 'User2'
Get-Content c:\datei.txt | ForEach-Object {
if ($_ -notmatch $User){
$line # send the line to the output pipeline
}
} | Out-File c:\datei.txt
Но тогда он просто действует как фильтр, и вы можете изменить foreach-object / if() {}
для where-object
фильтра:
$user = 'User2'
Get-Content c:\datei.txt | Where-Object {
$_ -notmatch $User
} | Out-File c:\datei.txt
А затем замените Out-file
на Set-Content
(соединение - это get-content / set-content, и это дает больше контроля над выходной кодировкой, если вам это нужно):
$user = 'User2'
Get-Content c:\datei.txt |
Where-Object { $_ -notmatch $User } |
Set-Content c:\datei.txt