我试图从我在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
但我不能让它从视觉上发挥作用。
答案 0 :(得分:2)
首先,你的命令是完全错误的。您正在调用pg_dump
,希望从读取文件,因此您不想使用>
。它会写入文件并在此过程中覆盖它。相反,您需要<
,&#34;读取文件作为标准输入&#34;操作
但这不是导致错误的直接原因。 pg_dump
无法理解>
,<
等。这些操作会指示shell(cmd.exe
)执行I/O redirection。如果您未运行cmd.exe
,那么他们就无法工作。要获得I / O重定向(>
等),您需要通过cmd
shell运行该过程,而不是直接调用它。
在这种情况下,use the -f filename
option to pg_dump
to tell it to write to a file代替标准输出可能更好。这样你就可以避免I / O重定向,不再需要shell了。它应该简单:
Dim args As String = "-h serverip -p 5432 -U postgres db_name -f " & txtPath.Text.ToString
或者,您可以使用cmd /C
通过命令shell调用pg_dump
。 Visual Basic可能提供了一种快捷方式来实现这一点;我没有使用它,因此我无法专门评论Visual Basic中进程调用的机制。检查CreateProcess
docs; VB可能会使用CreateProcess。
我个人建议你这样做