C# 如何向控制台应用程序提供密码?

C# 如何向控制台应用程序提供密码?,c#,redirect,console,C#,Redirect,Console,当我在测试当前应用程序时遇到问题时,我经常不得不调整应用程序使用的数据库。在多次丢失重要更改后,我编写了一个程序,将数据库备份到一个文件中,然后将该文件签入SubVersion。我发现备份应用程序不够好 数据库是一个PostgreSQL数据库,我的备份应用程序调用pg_dump来创建备份文件。pg_转储在控制台窗口中执行。当数据库在我自己的机器上时,它工作得很好。但是当我将数据库移动到测试服务器时,pg_dump要求输入密码。虽然这没什么大不了的,但我希望能够自动提供密码,因为它在备份应用程序中

当我在测试当前应用程序时遇到问题时,我经常不得不调整应用程序使用的数据库。在多次丢失重要更改后,我编写了一个程序,将数据库备份到一个文件中,然后将该文件签入SubVersion。我发现备份应用程序不够好

数据库是一个PostgreSQL数据库,我的备份应用程序调用pg_dump来创建备份文件。pg_转储在控制台窗口中执行。当数据库在我自己的机器上时,它工作得很好。但是当我将数据库移动到测试服务器时,pg_dump要求输入密码。虽然这没什么大不了的,但我希望能够自动提供密码,因为它在备份应用程序中可用

我试着按照我在这里找到的建议去做,但是pg_dump仍然会停下来并要求输入密码。以下是我认为应该提供密码的代码:

Process backupProcess = new Process();
backupProcess.StartInfo.UseShellExecute = false;
backupProcess.StartInfo.RedirectStandardInput = true;
backupProcess.StartInfo.FileName = dumpPath + "pg_dump.exe";
backupProcess.StartInfo.Arguments = " --host " + host + 
                                    " --port " + port + 
                                    " --username " + userName + 
                                    " --format custom --blobs --verbose --file " +
                                    "\"" + txtBackupFile.Text + "\" " + dbName;
backupProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
backupProcess.Start();
StreamWriter standardInput = backupProcess.StandardInput;
standardInput.WriteLine("mypassword");
backupProcess.WaitForExit();// Waits here for the process to exit.
谢谢你的帮助


RobR

也许它有点作弊(从某种意义上说,它并不能真正帮助您回答如何将输入提供给
pg_dump
),但您可以参考其中建议使用
.pgpass
文件的内容。当然可以动态写入该文件,而不是在程序提示时尝试与程序交互


关于
.pgpass
的信息我已经通过使用

backupProcess.EnvironmentVariables["PGPASSWORD"] = "password";

这样,我就避免了将密码存储在计算机上

应该考虑使用Path.Combine(dumpPath,“pg_dump.exe”)而不是“dumpPath+”pg_dump.exe”“谢谢。我没有意识到这种方法的存在。这比担心我是否有斜杠要好得多。非常感谢你的链接。我将了解如何设置一个.pgpass文件,或者我可能会使用answer建议的Python脚本。我还没有试过这两种方法,但在这里,我会将其标记为已接受的答案。听起来,在.NET中在命令行上自动化交互(就像使用“expect”工具或类似工具一样)有点不可靠。顺便说一下,如果您编写一个伪“pg_dump.exe”,即.NET程序.backupProcess.StartInfo.EnvironmentVariables[“PGPASSWORD”]