在多行字符串连接中转义命令中的双引号

Escape double quotes in a command within multiline string concatenation

我正在尝试从 Azure DevOps 管道中执行 运行 psql \copy 命令,该管道对我所有的 table 都工作正常,但 table 我们的 table 名称包含破折号:my-table-name.

任务脚本:

- task: PowerShell@2
    displayName: "Populate data"
    inputs:
      targetType: 'inline'
      script: |
        #Setup PostgreSQL
        Set-Service postgresql-x64-14 -StartupType manual
        Start-Service postgresql-x64-14
        Get-CimInstance win32_service | Where-Object Name -eq "postgresql-x64-14"
        #Create tables in PostgreSql database
        $PG_SQL = "C:\Program Files\PostgreSQL\bin\psql.exe";
        & $PG_SQL -d abcd -U abcd -c "\copy \"my-table-name\" from '$(build.artifactstagingdirectory)\dump.csv' with (format csv,header true,delimiter ';')";

希望实现(这在服务器内 运行 时有效):

psql -d abcd -U abcd -c "\copy \"my-table-name\" from 'directory\dump.csv' with (format csv,header true,delimiter ';')"

错误:

ERROR:  syntax error at or near "-"
LINE 1: COPY  my-table-name FROM STDIN with (format csv,header true...
                ^

我尝试了什么:

  1. 反引号:& $PG_SQL -d abcd -U abcd -c "\copy "my-table-name" from '$(build.artifactstagingdirectory)\dump.csv' with (format csv,header true,delimiter ';')"; -> 给出上述错误
  2. 正斜杠:& $PG_SQL -d abcd -U abcd -c "\copy \"my-table-name\" from '$(build.artifactstagingdirectory)\dump.csv' with (format csv,header true,delimiter ';')"; -> 给出上述错误
  3. 双引号:& $PG_SQL -d abcd -U abcd -c "\copy ""my-table-name"" from '$(build.artifactstagingdirectory)\dump.csv' with (format csv,header true,delimiter ';')"; -> 给出上述错误
  4. 预存储在变量中,然后用双引号括起变量:$cpy_cmd = '\copy \"my-table-name\" from D:\a\a\my-table-name.csv with (format csv,header true,delimiter \";\")'; & $PG_SQL -d abcd -U abcd -c "$cpy_cmd"; -> 有效,但是在这里我必须使用文件的静态路径而不是 cmdlet(这是我应该调用的方式吗?)
  • 在理想情况下,满足 PowerShell 的 own 语法要求就足以在 [=19] 中嵌入 " 个字符=],这意味着将它们转义为 `",使用 PowerShell 的 general-purpose 转义字符,反引号 (`),或者 - 不太常见 - 作为 "".

  • 但是,由于 long-standing 错误至少达到 PowerShell 7.2.4,您还必须 \-escape这样的嵌入 " 字符,以便 外部程序 可以看到它们。

    • 有关详细信息,请参阅 ,包括有关 v7.3 的 preview 版本中可用的实验性功能的信息,该功能可能会解决此问题,可能在 opt-in基础.

因此,为了 PowerShell 的缘故,首先 转义,然后 前缀为 \:

& $PG_SQL -d abcd -U abcd -c "\copy \`"my-table-name\`" from '$(build.artifactstagingdirectory)\dump.csv' with (format csv,header true,delimiter ';')";