从visual basic调用postgresql pg_dump.exe

从visual basic调用postgresql pg_dump.exe,postgresql,visual-studio-2012,Postgresql,Visual Studio 2012,我正在尝试使用visual basic(visual studio 2012)制作的应用程序备份我的数据库 我将pg_dump.exe和必要的dll文件复制到应用程序根目录 测试pg_dump从cmd窗口进行备份,然后运行正常 这是我用来尝试调用pg_dump exe的代码,但显然没有收到我试图发送的参数 ' New ProcessStartInfo created Dim p As New ProcessStartInfo Dim args As String = "-h se

我正在尝试使用visual basic(visual studio 2012)制作的应用程序备份我的数据库

我将pg_dump.exe和必要的dll文件复制到应用程序根目录

测试pg_dump从cmd窗口进行备份,然后运行正常

这是我用来尝试调用pg_dump exe的代码,但显然没有收到我试图发送的参数

' New ProcessStartInfo created
    Dim p As New ProcessStartInfo
    Dim args As String = "-h serverip -p 5432 -U postgres db_name > " & txtPath.Text.ToString

    ' Specify the location of the binary
    p.FileName = "pg_dump.exe"

    ' Use these arguments for the process
    p.Arguments = args

    ' Use a hidden window
    p.WindowStyle = ProcessWindowStyle.Maximized

    ' Start the process
    Process.Start(p)
当进程启动时,我收到以下消息:

pd\u dump:命令行参数太多(第一个是“>”) 有关更多信息,请尝试“pg_dump--help”

如果我在cmd中键入此命令,备份就完成了 pg_dump.exe-h serverip-p 5432-U postgres db_name>c:\db_bak.backup


但是我不能从视觉上让它工作。

首先,你的命令完全错误。您正在调用
pg_dump
,它想从文件中读取,因此您不想使用
。这将写入文件并在过程中覆盖它。相反,您希望
等)您需要通过
cmd
shell运行该进程,而不是直接调用它

在这种情况下,它可能更好地代替标准输出。这样可以避免I/O重定向,不再需要shell。它应该简单到:

Dim args As String = "-h serverip -p 5432 -U postgres db_name -f " & txtPath.Text.ToString
或者,您可以使用
cmd/C
通过命令shell调用
pg_dump
。VisualBasic可能提供了一种快捷方式来实现这一点;我不使用它,所以我不能具体评论VisualBasic中的进程调用机制。检查设备;VB可能在引擎盖下使用CreateProcess


我个人建议你这样做

你能给我举个小例子吗?我有点迷路了here@Hannibal不要使用I/O重定向(
>filename
),而是告诉
pg_dump
使用
-f filename
直接写入文件。参见
pg_dump
@Hannibal添加链接和进一步解释的文档。