file - PowerShell:设置内容与 "file already in use"有问题

标签 file powershell scripting replace locking

我正在编写一个 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 调用处。当然,由于我试图解决问题然后停止,该 block 中的一些代码现在有点困惑,但请记住脚本那部分的意图。我想获取内容,替换单词,然后将更改后的文本保存回我从中获取的文件。

任何帮助都将不胜感激。

最佳答案

删除了我之前的答案,将其替换为:

Get-ChildItem $directory -recurse:$recurse
foreach {        
    $file = ($directory + $_.FileName)

    (Get-Content $file) | Foreach-object {
        $_ -replace ([Regex]::Escape("[$pattern]")),"[$replace]")
    } | Set-Content $file
}

笔记:
  • Get-Content 周围的括号以确保文件被一口气吞下(因此关闭)。
  • 到后续命令的管道而不是内联。
  • 您的一些命令已被删除,以确保它是一个简单的测试。
  • 关于file - PowerShell:设置内容与 "file already in use"有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239702/

    相关文章:

    php - 尽管使用 PHP 具有适当的权限,但权限被拒绝

    java - 如何在java中下载给定url的文件?

    PowerShell 新分区提示 DriveLetter 参数

    powershell - 使用外部 CA 签署 Powershell 脚本

    python - Bash 脚本还有什么用处吗?

    java - 删除并重新创建文件/目录

    C# 获取带路径的数组的文件大小

    powershell - 在 cURL 中使用 HTTP header 传递 API key

    shell - 在shell脚本的for循环中使用sqlite3会产生错误

    scripting - 如何加载 Assets 包