0

我正在尝试从我在 Visual Basic(Visual Studio 2012)中制作的应用程序中备份我的数据库

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

测试 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_dump:命令行参数太多(第一个是“>”)尝试“pg_dump --help”以获取更多信息

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

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

4

1 回答 1

2

首先,您的命令完全错误。您正在调用pg_dump,它想文件中读取,所以您不想使用>. 那将写入文件并在此过程中覆盖它。相反,您需要<“将文件作为标准输入读取”运算符。

不过,这不是您错误的直接原因。pg_dump不明白><等。这些操作指示shell( cmd.exe) 进行I/O 重定向。如果你不跑步,cmd.exe那么它们就不起作用。要获得 I/O 重定向(>等),您需要通过cmdshell 运行进程,而不是直接调用它。

在这种情况下,最好使用-f filename选项pg_dump告诉它写入文件而不是标准输出。这样您就可以避免 I/O 重定向并且不再需要 shell。它应该很简单:

Dim args As String = "-h serverip -p 5432 -U postgres db_name -f " & txtPath.Text.ToString

或者,您可以使用通过命令 shellcmd /C调用。pg_dumpVisual Basic 可能会提供一种快捷方式来做到这一点。我不使用它,所以我无法具体评论 Visual Basic 中的进程调用机制。检查CreateProcess文档;VB 可能在后台使用 CreateProcess。

我个人建议你这样做

于 2013-08-26T08:01:25.750 回答