我有一个包含内容的 .cmd 文件:
pg_dump -h localhost -p 5432 -U postgres --create --format=plain --encoding=UTF8 --file="D:\temp.snapshot.sql" database_name
该脚本从 CMD 运行良好,没有任何错误。temp.snapshot.sql 文件是用内容创建的。
我尝试在 c# 中从 Windows 服务运行此脚本,如下所示:
Process process = new Process();
process.StartInfo = new ProcessStartInfo("D:\script.cmd");
process.StartInfo.UseShellExecute = false;
process.EnableRaisingEvents = true;
process.Start();
process.WaitForExit();
它挂在 WaitForExit 方法上。如果我为超时添加一个参数,它会超时并且结果是一样的。生成了 temp.snapshot.sql,但它的大小为 0 字节。这意味着脚本文件已经运行。temp.snapshot.sql 文件也被锁定,无法删除。LockHunter 说它被 pg_dump.exe 和 cmd.exe 锁定。
我做错了什么?
谢谢
解决方案
您不能将密码作为参数传递给 postgres。Postgres 从 pgpass.conf 中获取它。所以在我的情况下 cmd 只是挂起等待密码。
因此,您找到该文件(如果存在),对其进行备份。用您需要的新密码覆盖它。
字符串 appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string postgresPath = Path.Combine(appdata, "postgresql");
if (!Directory.Exists(postgresPath))
Directory.CreateDirectory(postgresPath);
string passFile = Path.Combine(postgresPath, "pgpass.conf");
string passFileContent = string.Format("{0}:{1}:*:{2}:{3}", "localhost", "5432", "user", "pass");
bool passwordBackuped = false;
//Backup previous password if exists
if (File.Exists(passFile))
{
File.Copy(passFile, passFile + "_", true);
passwordBackuped = true;
}
处理完成后复制备份文件
if (passwordBackuped)
File.Copy(passFile + "_", passFile, true);