windows - 使用 powershell 删除文件中的特定行

标签 windows file powershell csv

我想在 powershell 脚本的单个 .csv 文件中删除包含特殊单词的完整行。

我已经找到了工作代码,它删除了特定行,但将所有其他行写入第一行。这不应该发生,因为我将 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

我在 Windows 7 上使用 Powershell 5.1.x

最佳答案

发生这种情况是因为您正在进行字符串连接。

$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

关于windows - 使用 powershell 删除文件中的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50057416/

相关文章:

windows - 在 C++ 中模拟 Alt Tab 键盘按下以启动 Fast Switch 窗口

file - Flutter 使用 http 包监控文件上传进度

powershell - WinSCP 和定义的端口

file - 如何在unix中并排显示行号?

java - 追踪文件句柄

excel - Powershell - 将 'wrapText' 样式应用于某些单元格会导致整个工作表换行

powershell - 如何检查MS部署是否正常工作

C++ winapi 提升

c++ - 为 C++ 设置窗口

windows - 内存保留和提交