我正在使用PowerShell脚本查找给定DIRECTORY中包含PATTERN的所有文件,打印出突出显示PATTERN的文档的相关行,然后用提供的REPLACE字替换PATTERN,然后保存归档。所以它实际上编辑了文件。
除非我无法让它改变文件,因为Windows抱怨文件已经打开。我尝试了几种方法来解决这个问题,但仍然遇到问题。也许有人可以提供帮助:
param(
[string] $pattern = ""
,[string] $replace = ""
,[string] $directory ="."
,[switch] $recurse = $false
,[switch] $caseSensitive = $false)
if($pattern -eq $null -or $pattern -eq "")
{
Write-Error "Please provide a search pattern." ; return
}
if($directory -eq $null -or $directory -eq "")
{
Write-Error "Please provide a directory." ; return
}
if($replace -eq $null -or $replace -eq "")
{
Write-Error "Please provide a string to replace." ; return
}
$regexPattern = $pattern
if($caseSensitive -eq $false) { $regexPattern = "(?i)$regexPattern" }
$regex = New-Object System.Text.RegularExpressions.Regex $regexPattern
function Write-HostAndHighlightPattern([string] $inputText)
{
$index = 0
$length = $inputText.Length
while($index -lt $length)
{
$match = $regex.Match($inputText, $index)
if($match.Success -and $match.Length -gt 0)
{
Write-Host $inputText.SubString($index, $match.Index) -nonewline
Write-Host $match.Value.ToString() -ForegroundColor Red -nonewline
$index = $match.Index + $match.Length
}
else
{
Write-Host $inputText.SubString($index) -nonewline
$index = $inputText.Length
}
}
}
Get-ChildItem $directory -recurse:$recurse |
Select-String -caseSensitive:$caseSensitive -pattern:$pattern |
foreach {
$file = ($directory + $_.FileName)
Write-Host "$($_.FileName)($($_.LineNumber)): " -nonewline
Write-HostAndHighlightPattern $_.Line
%{ Set-Content $file ((Get-Content $file) -replace ([Regex]::Escape("[$pattern]")),"[$replace]")}
Write-Host "`n"
Write-Host "Processed: $($file)"
}
问题位于最后一段代码中,就在Get-ChildItem调用中。当然,由于我试图解决问题然后停止,该块中的一些代码现在有点受损,但请记住该部分脚本的意图。我想获取内容,替换单词,然后将更改的文本保存回我从中获取的文件。
非常感谢任何帮助。
答案 0 :(得分:4)
删除了我以前的答案,替换为:
Get-ChildItem $directory -recurse:$recurse
foreach {
$file = ($directory + $_.FileName)
(Get-Content $file) | Foreach-object {
$_ -replace ([Regex]::Escape("[$pattern]")),"[$replace]")
} | Set-Content $file
}
注意:
Get-Content
的括号,以确保文件一次性啜饮(因此关闭)。答案 1 :(得分:0)
只是一个建议,但您可以尝试查看参数代码块的文档。如果需要,可以使用更有效的方法确保输入参数,如果用户没有,则抛出错误消息。
About_throw:http://technet.microsoft.com/en-us/library/dd819510.aspx About_functions_advanced_parameters:http://technet.microsoft.com/en-us/library/dd347600.aspx
然后一直使用Write-Host:http://powershell.com/cs/blogs/donjones/archive/2012/04/06/2012-scripting-games-commentary-stop-using-write-host.aspx
答案 2 :(得分:0)
好吧,我终于坐下来,在PowerShell中按顺序键入所有内容,然后使用它来制作我的脚本。
实际上非常简单;
$items = Get-ChildItem $directory -recurse:$recurse
$items |
foreach {
$file = $_.FullName
$content = get-content $file
$newContent = $content -replace $pattern, $replace
Set-Content $file $newcontent
}
感谢所有帮助人员。