удалить определенную строку в файле с PowerShell - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу удалить всю строку, содержащую специальное слово в одном файле .csv в сценарии powershell.

Я уже нашел рабочий код, который удаляет конкретную строку, но записывает все остальные строки в первую строку. Этого не должно быть, потому что я связал csv-файл с таблицей доступа ms.

    $user = 'User2'
    $file = Get-Content c:\datei.txt
    $newLine = ""

    foreach($line in $file){

        if($line -match $User){
         }else{
            $newLine += $line
        }
    }
    $newLine | Out-File c:\datei.txt

Файл выглядит так, но с большим количеством данных и строк:

User;computer;screen1;screen2;printer
User1;bla;bla;;bla
User2;bla;bla;bla;bla
User3;bla;bla;bla;bla

После запуска кода:

User;computer;screen1;screen2;printerUser1;bla;bla;;blaUser3;bla;bla;bla;bla

Я использую Powershell 5.1.x в Windows 7

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Это происходит потому, что вы делаете конкатенацию строк.

$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
0 голосов
/ 27 апреля 2018

Вам необходимо добавить «новую строку» в конце каждой строки текста. Измените эту строку:

$newLine += $line

до:

$newLine += "$line`r`n"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...