好了,所以在这找了一段时间后,我决定必须有一种方法用一个衬垫做到这一点。那就是:
(gc "c:\myfile.txt") | % -Begin {$test = (gc "c:\myfile.txt" | select -first 1 -last 1)} -Process {if ($_ -eq $test[0] -or $_ -eq $test[-1]) { $_ -replace "-" } else { $_ }} | Set-Content "c:\myfile.txt"
这是什么,这是做了细分:
首先,对于那些现在熟悉的别名。我只是把他们因为命令是足够长的时间,因为它是,所以这有助于保持便于管理:
gc
意味着Get-Content
%
意味着Foreach
$_
是当前管道值(这ISN “T的别名,但我想我会定义它,因为你说你是新的)
好了,现在这里是在此发生的事情:
(gc "c:\myfile.txt") |
- >获取的c:\myfile.txt
的内容并把它上下行
%
- >是否foreach循环
-Begin {$test = (gc "c:\myfile.txt" | select -first 1 -last 1)}
(通过每个项目单独的管道进入) - >这是它是一个开始块,在它进入管道之前,它在这里运行所有的东西。它将c:\myfile.txt
的第一行和最后一行加载到数组中,以便我们检查第一个和最后一个项目
-Process {if ($_ -eq $test[0] -or $_ -eq $test[-1])
- >这将对管道中的每个项目执行检查,检查它是否是第一个或最后一个项目文件
{ $_ -replace "-" } else { $_ }
- >如果它是第一个或最后一个,但它的替代品,如果它不是,它只是离开它单独
| Set-Content "c:\myfile.txt"
- >这使新值回文件。
请参看下面的网站的详细信息,其中的每一项:在Foreach的
Get-Content uses
Get-Content definition
Foreach
The Pipeline
Begin and Process部分(这通常是自定义的功能,但他们也在foreach循环中工作)
If ... else陈述
Set-Content
所以我在想,如果你想要做什么这许多文件,或想经常这样做。我决定做一个能够完成你所问的功能。这里是功能:
function Replace-FirstLast {
[CmdletBinding()]
param(
[Parameter(`
Position=0, `
Mandatory=$true)]
[String]$File,
[Parameter(`
Position=1, `
Mandatory=$true)]
[ValidateNotNull()]
[regex]$Regex,
[Parameter(`
position=2, `
Mandatory=$false)]
[string]$ReplaceWith=""
)
Begin {
$lines = Get-Content $File
} #end begin
Process {
foreach ($line in $lines) {
if ($line -eq $lines[0] ) {
$lines[0] = $line -replace $Regex,$ReplaceWith
} #end if
if ($line -eq $lines[-1]) {
$lines[-1] = $line -replace $Regex,$ReplaceWith
}
} #end foreach
}#End process
end {
$lines | Set-Content $File
}#end end
} #end function
这将创建一个命令叫做Replace-FirstLast
。它会被称为是这样的:
Replace-FirstLast -File "C:\myfiles.txt" -Regex "-" -ReplaceWith "NewText"
的-Replacewith
是可选的,如果是空白的,将直接删除(的""
默认值)。 -Regex
正在寻找一个正则表达式来匹配你的命令。有关将其放至您的个人资料检查信息this article
请注意:如果文件非常大(几个GB),这是不是最好的解决办法。这会导致整个文件存储在内存中,这可能会导致其他问题。
很好的答案,但请注意,如果文件变大,则在begin语句中使用'get-content -First 1'和'-Last 1'会更好,因此您不必将xxGB文件保留在处理时的内存。 –
确实如此,但是我们又回到了没有把整个文件传回去的问题,只是第一行和最后一行。 – Nick
没有。我在开头声明“foreach -begin {..here ...}'中说过。 :) –