好了,所以在這找了一段時間後,我決定必須有一種方法用一個襯墊做到這一點。那就是:
(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 ...}'中說過。 :) –