如何使用Where-Object和StartsWith根据内容过滤掉文件 - Powershell v4.0

时间:2017-12-12 10:21:23

标签: powershell powershell-v4.0

我试图在文件夹中处理SQL文件,重命名它们,如果文件内容以' / **'开头。然后我想从文件内容中删除前三行并覆盖该文件。 下面的代码可以工作,但是当添加其中一个注释掉的行时,它会返回错误消息。

function Get-ScriptDirectory
{
  $Invocation = (Get-Variable MyInvocation -Scope 1).Value
  Split-Path $Invocation.MyCommand.Path
}

$sqlfolder = Get-ScriptDirectory

$files = Get-ChildItem $sqlfolder\* -Include *.sql

Foreach ($file in $files) {
    Write-Output $file.name
    $newName = $file.name.Substring($file.name.LastIndexOf(" ")+1)
    Rename-Item $file -NewName $newName
    get-content $file |
    ##Where-Object {$_.StartsWith("/**")} |
    ##Where-Object {$_ -Like "/**"} |
        select -Skip 3 |
        set-content "$file-temp"
    move "$file-temp" $file -Force
}

我想要其中一条注释掉的行,以确保只会从以字符串' / **'开头的文件中删除前三行。

错误讯息:

move : Cannot find path ...-temp' because it does not exist.
... ObjectNotFound ... PathNotFound ...

1 个答案:

答案 0 :(得分:1)

我只能使用评论中建议的If来修改以文本'/ **'开头的文件。这是最终的代码:

function Get-ScriptDirectory
{
  $Invocation = (Get-Variable MyInvocation -Scope 1).Value
  Split-Path $Invocation.MyCommand.Path
}

$sqlfolder = Get-ScriptDirectory

$files = Get-ChildItem $sqlfolder\* -Include *.sql

Foreach ($file in $files) {
    # Write-Output $file.name
    $newName = $file.name.Substring($file.name.LastIndexOf(" ")+1)
    Rename-Item $file -NewName $newName

    $firstLine = (Get-Content $file)[0] 

    if ($firstLine.StartsWith("/**")){
        Get-Content $file |
        select -Skip 3 |
        set-content "${file}-temp"
        move "${file}-temp" $file -Force
    }
}