我有几个文件需要添加"!"到了开头,就在第一行。我仍然需要保留第一行的内容,只需添加一个"!"作为第一个角色。
任何帮助都会非常感激。
谢谢!
编辑: 到目前为止我唯一能想到的就是做以下事情:
$a = Get-Content 'hh_Regulars3.csv'
$b = '!'
Set-Content 'hh_Regulars3-new.csv' -value $b,$a
这只是添加了"!"到文件的顶部,而不是第一行的开头。
答案 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
括号对于确保文件在通过管道之前被读入是很重要的。它允许我们在同一个管道上进行读写。
如果文件较大,请查看使用StreamReader
和StreamWriter
s。如果不保证由Add-Content
和Set-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"