前置"!"到文件第一行的开头

时间:2016-03-02 19:11:16

标签: powershell

我有几个文件需要添加"!"到了开头,就在第一行。我仍然需要保留第一行的内容,只需添加一个"!"作为第一个角色。

任何帮助都会非常感激。

谢谢!

编辑: 到目前为止我唯一能想到的就是做以下事情:

$a = Get-Content 'hh_Regulars3.csv'
$b = '!'
Set-Content 'hh_Regulars3-new.csv' -value $b,$a

这只是添加了"!"到文件的顶部,而不是第一行的开头。

4 个答案:

答案 0 :(得分:13)

您使用Set-Content$b,$a发送了一个数组。如您所见,每个数组项都将拥有自己的行。如果执行,它将在提示符上显示相同的方式。

只要文件不太大,请将其作为一个字符串读入,并在中添加字符。

$path = 'hh_Regulars3.csv'
"!" + (Get-Content $path -Raw) | Set-Content $path

如果您只有PowerShell 2.0,那么Out-String将代替-Raw

"!" + (Get-Content $path | Out-String) | Set-Content $path

括号对于确保文件在通过管道之前被读入是很重要的。它允许我们在同一个管道上进行读写。

如果文件较大,请查看使用StreamReaderStreamWriter s。如果不保证由Add-ContentSet-Content创建的尾随新行,也必须使用此选项。

答案 1 :(得分:2)

这个oneliner可能有效:

get-ChildItem *.txt | % { [System.Collections.ArrayList]$lines=Get-Content $_;
                          $lines[0]=$lines[0].Insert(0,"!") ;
                          Set-Content "new_$($_.name)" -Value $lines}

答案 2 :(得分:0)

试试这个:

$a = get-content "c:\yourfile.csv"
$a | %{ $b = "!" + $a ; $b | add-content "c:\newfile.csv" }

答案 3 :(得分:0)

晚会,但认为这可能有用。我需要执行超过一千个+大文件的操作,并且需要一些更强大且更不容易出现OOM异常的东西。结束了利用.Net库编写它:

function PrependTo-File{
  [cmdletbinding()]
  param(
    [Parameter(
      Position=1,
      ValueFromPipeline=$true,
      Mandatory=$true,
      ValueFromPipelineByPropertyName=$true
    )]
    [System.IO.FileInfo]
    $file,
    [string]
    [Parameter(
      Position=0,
      ValueFromPipeline=$false,
      Mandatory=$true
    )]
    $content
  )

  process{
    if(!$file.exists){
      write-error "$file does not exist";
      return;
    }
    $filepath = $file.fullname;
    $tmptoken = (get-location).path + "\_tmpfile" + $file.name;
    write-verbose "$tmptoken created to as buffer";
    $tfs = [System.io.file]::create($tmptoken);
    $fs = [System.IO.File]::Open($file.fullname,[System.IO.FileMode]::Open,[System.IO.FileAccess]::ReadWrite);
    try{
      $msg = $content.tochararray();
      $tfs.write($msg,0,$msg.length);
      $fs.position = 0;
      $fs.copyTo($tfs);
    }
    catch{
      write-verbose $_.Exception.Message;
    }
    finally{

      $tfs.close();
      # close calls dispose and gc.supressfinalize internally
      $fs.close();
      if($error.count -eq 0){
        write-verbose ("updating $filepath");
        [System.io.File]::Delete($filepath);
        [System.io.file]::Move($tmptoken,$filepath);
      }
      else{
        $error.clear();
        write-verbose ("an error occured, rolling back. $filepath not effected");
        [System.io.file]::Delete($tmptoken);
      }
    }
  }
}

用法:

PS> get-item fileName.ext | PrependTo-File "contentToAdd`r`n"