在Powershell或Batch中附加到特定行的末尾

时间:2016-06-17 17:57:42

标签: powershell batch-file

我试图弄清楚如何将字符串附加到文件中特定行的末尾。

示例文件:

n

我不知道" LineToAppendTo"的行号。线。我所知道的是,该行以文本" LineToAppendTo"开头。然后是一堆我不知道或不关心的随机文本。我想要做的就是附加一个字符串",attachedString"到那条线的尽头。

使用上面给出的示例输出将是:

Some text
...
LineToAppendTo,otherrandomtext,...,endoflinetext
...
End of file text

我如何做到这一点是powershell(如果不是powershell,我也可以使用批处理)?

3 个答案:

答案 0 :(得分:2)

你可以使用这个功能,我已经测试了它的功能。函数AppendToFile包含2个参数PathToFileTextToAdd。如果您有任何问题,请告诉我们!

Function AppendToFile {

    param([String]$PathToFile, [String]$TextToAdd)

    $lines = Get-Content $PathToFile | Where {$_ -notmatch '^\s+$'} 

    foreach ($line in $lines) {
        if ($line -like "LineToAppendTo*") {
            $lines[$lines.IndexOf($line)] += $TextToAdd
        }
    }
    $lines | Set-Content $PathToFile
}

# example use of function
AppendToFile -PathToFile "C:\myTextFile.txt" -TextToAdd "add this"

从此处的解决方案进行了修改:Add-Content - append to specific line

答案 1 :(得分:2)

(gc D:\in.txt) -replace '^LineToAppendTo.*', '$0,AppendText' | sc d:\out.txt

获取行,将“LineToAppendTo”替换为自己的行,然后加上“,AppendText”(其他行保持不变)。将行输出到文件。

如果您不想使用正则表达式,您可以轻松地:

gc D:\in.txt |% {
    if ($_.StartsWith('LineToAppendTo')) {"$_,AppendText"} else {$_} 
} | sc d:\out.txt

-

  • 两者都使用gc Get-Contentsc Set-Content
  • 第一个使用-replace作用于数组中每个项目的事实。
  • 第二个使用%作为ForEach-Object来明确循环每一行。

答案 2 :(得分:1)

以下是解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "FILE=%~1"
set "PREFIX=LineToAppendTo"
set "SUFFIX=,appendedString"

for /F "usebackq delims=" %%L in ("%FILE%") do (
    set "LINE=%%L"
    setlocal EnableDelayedExpansion
    for /F "tokens=1 delims=," %%S in ("!LINE:*:=!") do (
        endlocal
        set "STRING=%%S"
        setlocal EnableDelayedExpansion
        if "!STRING!"=="!PREFIX!" (
            echo(!LINE!!SUFFIX!
        ) else (
            echo(!LINE!
        )
    )
    endlocal
)

endlocal
exit /B

作为命令行参数给出的文本文件由for /F循环逐行读取。每一行在第一个,处拆分,其前面的部分与前缀LineToAppendTo进行比较。如果相等,则输出后缀为,appendedString的行;如果没有,该行未经编辑输出。

如果要将输出存储到文件中,请使用重定向,假设脚本名为append.bat

append.bat "\path\to\input_file.txt" > "\path\to\output_file.txt"