路径中的非法字符 - 通过 SqlPackage.exe 进行 dacpac 部署

Illegal characters in path - dacpac deployment via SqlPackage.exe

提问人:spottedmahn 提问时间:10/24/2023 最后编辑:marc_sspottedmahn 更新时间:10/26/2023 访问量:50

问:

我想使用展开调用,但是我做错了什么,因为我收到一个错误:SqlPackage.exe

路径中的非法字符。

$FilePath = 'C:\some path\SqlPackage.exe'
$ArgumentList = @(
    '/Action:Publish'
    '/SourceFile:"C:\some path\blah.dacpac"'
    '/TargetConnectionString:"Server=localhost; Database=Blah; Trusted_Connection=True;"'
)
& $FilePath $ArgumentList

按照这个答案,我似乎需要使用阵列展开,对吗?

问题似乎在于处理 SqlPackage 的参数约定,特别是双引号。/[name]:"[value]"

我如何处理动态值?即:

$Blah = 'blah.dacpac'
$ArgumentList = @(
    '/Action:Publish'
    '/SourceFile:"C:\some path\$Blah"'
    '/TargetConnectionString:"Server=localhost; Database=Blah; Trusted_Connection=True;"'
)

参考:SqlPackage 发布示例

PowerShell 的sql-server-data-tools

评论


答:

1赞 mklement0 10/24/2023 #1

您的命令应该有效:

  • Windows PowerShell 和 PowerShell (Core) v7.2- 中:

    • 默认情况下。

    • 在幕后构造的原始进程命令行如下所示:

      "C:\some path\SqlPackage.exe" /Action:Publish /SourceFile:"C:\some path\blah.dacpac" /TargetConnectionString:"Server=localhost; Database=Blah; Trusted_Connection=True;"
      
  • PowerShell (Core) 7.3+ 中:

    • 仅当您(临时)将 $PSNativeCommandArgumentPassing 首选项变量设置为 时。'Legacy'

    • 否则(使用 value(默认值)或 ),原始进程命令行如下所示 - 请注意某些参数的整体外壳以及嵌入的字符如何转义为:'Windows''Standard'"...""\"

      "C:\some path\SqlPackage.exe" /Action:Publish "/SourceFile:\"C:\some path\blah.dacpac\"" "/TargetConnectionString:\"Server=localhost; Database=Blah; Trusted_Connection=True;\""
      

看:

  • 此答案为背景信息。

  • 这是对你之前的问题的回答,即如何检查 PowerShell 最终在幕后构建的原始流程线。

因此:

& {
  $PSNativeCommandArgumentPassing = 'Legacy' # Needed in v7.3+
  $FilePath = 'C:\some path\SqlPackage.exe'
  $ArgumentList = @(
    '/Action:Publish'
    '/SourceFile:"C:\some path\blah.dacpac"'
    '/TargetConnectionString:"Server=localhost; Database=Blah; Trusted_Connection=True;"'
  )
  & $FilePath $ArgumentList
}