Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从windows服务运行批处理脚本以转储数据库_C#_.net_Postgresql_Batch File_Windows Services - Fatal编程技术网

C# 从windows服务运行批处理脚本以转储数据库

C# 从windows服务运行批处理脚本以转储数据库,c#,.net,postgresql,batch-file,windows-services,C#,.net,Postgresql,Batch File,Windows Services,我有一个包含以下内容的.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(

我有一个包含以下内容的.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方法。如果我为timeout添加一个参数,它将超时,结果是相同的。已生成temp.snapshot.sql,但它的大小为0字节。这意味着脚本文件已经运行。此外,temp.snapshot.sql文件被锁定,无法删除。LockHunter说它被pg_dump.exe和cmd.exe锁定

我做错了什么

谢谢

解决方案

不能将密码作为参数传递给postgres。Postgres从pgpass.conf获取它。所以在我的情况下,cmd只是挂起等待密码

因此,您可以找到该文件(如果存在),对其进行备份。用您所需的新密码覆盖它

字符串appdata=Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

处理完成后,复制备份文件

if (passwordBackuped)
   File.Copy(passFile + "_", passFile, true);

基本上你有两个选择。如您所述,首选选项是使用pgpass.conf。第二个选项是使用PGPASSWORD环境变量传入密码。libpq连接接口接受这两种方法。出于安全原因,通常首选pgpass.conf方法,但在某些情况下,环境变量是完成任务的最佳方式。

看起来内部缓冲区已满。看见
if (passwordBackuped)
   File.Copy(passFile + "_", passFile, true);