前提・実現したいこと
C#でPostgreSQLに対して操作をしたいのですがエラーになってしまいます。
該当のソースコード
private void Button_Click(object sender, RoutedEventArgs e) { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec"); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = false; p.StartInfo.CreateNoWindow = true; p.StartInfo.Arguments = @"/c psql --version /w"; p.Start(); string results = p.StandardOutput.ReadToEnd(); p.WaitForExit(); p.Close(); Console.WriteLine(results); }
出力結果・エラーメッセージ
'psql' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
試したこと
調べた結果パスが通ってない場合にこのようなメッセージが表示されるという情報を多く見たのですが、パスは通っており、クライアントから直接コマンドプロンプトを開き、"psql --version"と入力した場合には正常にバージョンが表示されます。
プログラムを通してコマンドプロンプトを動作させるときのみこのようなメッセージが表示されてしまうのはなぜでしょうか。Pathはwindowsの環境設定にて通しました。
パスを通したやり方が間違っていないか、どうやって足したか、どうたされたことを確認したのかも示してください。システム環境変数のPATHの修正をしたのですか?
pathの設定などを含む環境変数は、プロセス毎に異なる場合があります。
psqlの呼出しの代わりに、setコマンドを用いて、コード内のプロセスの環境変数をご確認ください。
psqlをフルパスで書けば良いのでは?
そもそも、cmd.exeを経由せず直節psqlを起動すれば良いと思いますが。
>m6u
質問にも追記させていただきましたが、windowsの環境変数のパスにPostgreSQLのパスを追加しました。
>YT0014
実行時のパスにも確かにPostgreSQLのパスが入っていました…
下記の順で確認してみては?
1.アプリを使わずにコマンドラインから下記を実行
フルパス\psql.exe --version
2.上記1が動作したら、アプリから下記を実行
p.StartInfo.Arguments = @"フルパス\psql.exe --version";
>otn
「C:\Program Files\PostgreSQL\10\bin\psql.exe」
フルパスとはこの書き方で会ってますでしょうか?このコマンドはコマンドプロンプトで入力しても質問と同じエラーが出てしまいます。
>そもそも、cmd.exeを経由せず直節psqlを起動すれば良いと思いますが。
クライアントからサーバーのPostgreSQLのDBを操作しようとしています。そのためcmd.exeを経由して
っ接続を試みていたのですが直接psqlを起動するというのはどのような方法でしょうか?
上記2は間違え、下記で差し替えてください。
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.FileName = "フルパス\psql.exe";
psi.Arguments = @"--version";
System.Diagnostics.Process.Start(psi);
>kikukiku
すみません。コマンドラインからフルパスで実行するとエラーになってしまうのですが、やはりパスをちゃんと設定できていないのでしょうか…?
フルパス内にスペースが含まれる場合、ダブルクォーテーションが囲ってください。
"C:\Program Files\PostgreSQL\10\bin\psql.exe"
ユーザー環境変数とシステム環境変数の2種類があることにここまで触れていないけど、まぁいいや。
m6uさんへ
動作させることを先に確認してから、
パスのことをゆっくりやればいいんじゃないかと思っていました。
ご指摘の通りだと思います。
|
"実行時のパス"とは、何でしょうか?
ご提示いただいているC#のコード内で、setを実行した結果のPATHに、該当パスがあったということですか?
また、この欄での提案とその結果に関しては、質問を編集し、試した事に追記してください。
エラーメッセージが同一であれば、このままで良いかと。
> 直接psqlを起動するというのはどのような方法でしょうか?
p.StartInfo.FileName = psqlのフルパス;
中略
p.StartInfo.Arguments = @"/--version /w";
回答1件
あなたの回答
tips
プレビュー