使用 PowerShell 将 PostgreSQL 查询导出为 CSV

PostgreSQL Query export to CSV with PowerShell

$sf = "\\domain\dept\dcgsi\Extracts\Tableau_Unlicensed_Users.csv"

if (Test-Path $sf){
    Remove-Item $sf
}

$query = @"
\copy (SELECT Name 
FROM _users 
WHERE licensing_role_name = 'Unlicensed')
TO $sf
WITH CSV DELIMITER ','
"@ 
$conn = New-Object -ComObject ADODB.Connection

# use existing 64 bit ODBC System DSN that we set up manually
$conn.Open('PostgreSQL30')  
$conn.Execute($query)
$conn.Close()

当我尝试执行此操作时,我总是在 $conn.Execute() 行中收到有关“\”的错误。我认为这与字符转义有关,也许我做错了。

如果我只需要从 _users 获取任何记录的名称字段并将其输出到 CSV,是否有更好的方法使用 PowerShell 执行此操作?

最终我将添加更多内容以循环遍历 CSV 中的每条记录并执行 tabcmd 以删除所有未经许可的用户。

$sf = "\domain\dept\dcgsi\Extracts\Tableau_Unlicensed_Users.csv"

if (Test-Path $sf){
    Remove-Item $sf
}

$query = @"
SELECT Name 
FROM _users 
WHERE licensing_role_name = 'Unlicensed'
"@ 

function Get-ODBC-Data{
    $conn = New-Object System.Data.Odbc.OdbcConnection
    $conn.ConnectionString = "DSN=PostgreSQL30;"
    $conn.Open()
    $cmd = New-object System.Data.Odbc.OdbcCommand($query, $conn)
    $ds = New-Object system.Data.DataSet
    (New-Object System.Data.Odbc.OdbcDataAdapter($cmd)).Fill($ds) | Out-Null
    $conn.Close()
    $ds.Tables[0] | Export-Csv $sf
}

Get-ODBC-Data

这满足了我 99% 的需求;我现在只需要处理 csv 并删除前两行。第一行是类型信息消息,第二行是列 header.