无法将类型“ System.String”的“ / Action:”值转换为类型“ System.Management.Automation.ScriptBlock”

问题描述

我在尝试执行Power-Shell(7.0)脚本以下时遇到此错误。 该脚本使用dacpac文件sqlPackage.exe更新所有数据库

[string]$sqlPackagePath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\Microsoft\sqlDB\DAC\150\sqlPackage.exe"
[int]$ErrorCount = 0
$DatabaseNames | ForEach-Object -Parallel {
    
    echo "$_ - Updating database using DACPAC."
    
    dir -Path "C:\Program Files (x86)\Microsoft Visual Studio*" -Filter "sqlPackage.exe" -Recurse -ErrorAction SilentlyContinue | %{$_.FullName} {$using:sqlPackagePath /Action:Publish /tu:$using:DatabaseUsername /tp:$using:DatabasePassword /tsn:$using:ServerInstance /tdn:"$_" /sf:using:$DacpacLocation /p:BlockOnPossibleDataLoss=False}
        
  }

我是PowerShell脚本的新手。看来问题似乎与传递参数的方式有关,所以我在参数$ using:sqlPackagePath参数下遇到另一个下面的错误时,将{}放在参数周围,但这似乎不起作用

无法将类型“ System.String”的“ somepath”值转换为类型 “ System.Management.Automation.ScriptBlock”。

解决方法

您不能通过将参数嵌套在脚本块文字中来“转义”。

听起来你想做:

[string]$SqlPackagePath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150\SqlPackage.exe"
[int]$ErrorCount = 0
$DatabaseNames | ForEach-Object -Parallel {
    
    echo "$_ - Updating database using DACPAC."

    # locate SqlPackage,otherwise default to `$SqlPackagePath` from calling scope
    $sqlPackageExe = dir -Path "C:\Program Files (x86)\Microsoft Visual Studio*" -Filter "SqlPackage.exe" -Recurse -ErrorAction SilentlyContinue |Select -First 1
    if(-not $sqlPackageExe){
        $sqlPackageExe = $using:SqlPackagePath
    }

    # use the `&` invocation operator to execute SqlPackage
    & $sqlPackageExe /Action:Publish /tu:$using:DatabaseUsername /tp:$using:DatabasePassword /tsn:$using:ServerInstance /tdn:"$_" /sf:$using:DacpacLocation /p:BlockOnPossibleDataLoss=False        
}