如何向PowerShell脚本调用的pg_dump程序传递命令行参数?
报错核心原因
你之前写的PowerShell脚本直接换行拆分语句时没有加续行标记,PowerShell会把带空格路径的pg_dump.exe调用当成独立的单行语句执行,换行后的--host localhost片段就成了独立的PowerShell命令片段,自然会被识别为PowerShell自身的参数报语法错误。
正确的参数传递实现方案
- PowerShell中调用外部可执行程序的多行写法,必须在每行语句结尾加反引号`作为续行符,不能照搬批处理的无标记软换行写法。
- 日期格式化直接用PowerShell原生的
Get-Date方法,生成不受系统区域设置影响的标准化日期字符串,替代批处理里的%DATE:~x,x%截取逻辑。 - 对带空格的路径、数据库名,统一用双引号包裹,避免PowerShell错误拆分参数。
- 最稳妥的传参方式是把所有传给pg_dump的参数存为数组变量,PowerShell调用外部程序时会自动按命令行规则解析数组元素,不会出现把整串参数当成单值传递的问题。
完整可直接运行的脚本示例:
# 生成符合yyyyMMdd格式的备份日期字符串 $backupDate = Get-Date -Format "yyyyMMdd" # 定义pg_dump的完整安装路径 $pgDumpPath = "C:\Program Files (x86)\PostgreSQL\9.3\bin\pg_dump.exe" # 将所有待传递的命令行参数存入数组,自动适配带空格的内容 $pgArgs = @( "--host", "localhost", "--port", "5432", "--username", "postgres", "--no-password", "--format", "custom", "--verbose", "--file", "C:\misc\restore_test_$backupDate.backup", "Restore Test" ) # 执行备份,将所有输出流追加到日志文件 & $pgDumpPath $pgArgs *>> "C:\misc\restore.txt"
常见踩坑提醒
- 不要把所有参数拼接为单个长字符串直接传给pg_dump,PowerShell会按自身的引号解析规则拆分整串内容,带空格的路径和参数极易传递错误,数组传参是对新手最友好的无歧义写法。
- 如果把外部程序的路径存在自定义变量里,调用时必须加
&(调用操作符)前缀,否则PowerShell只会把路径字符串打印出来,不会实际启动pg_dump程序。 - 在Windows任务计划程序中调用该脚本时,程序路径选择
powershell.exe,参数栏填写-NoProfile -ExecutionPolicy Bypass -File "db_backup.ps1的完整绝对路径",避免被系统默认的脚本执行策略拦截。 - 你之前尝试把所有参数打包为单字符串传递失败,本质是PowerShell对外部exe的单字符串参数处理逻辑和批处理不同,用数组传参完全可以规避这个逻辑差异。
内容的提问来源于stack exchange,提问作者ROBERT RICHARDSON
相关产品推荐
相关产品推荐

