Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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#进程。带破折号的Start参数无法执行_C#_Gnupg_Process.start - Fatal编程技术网

C#进程。带破折号的Start参数无法执行

C#进程。带破折号的Start参数无法执行,c#,gnupg,process.start,C#,Gnupg,Process.start,我在努力解决一些我不太适应的问题时遇到了一些困难。我的问题似乎源于传递给Process.Start()的一个参数中的破折号/连字符。在下面的代码中,参数列表是根据数据库中的数据构建的。当sRecipient有破折号时,会发生此问题。例如,银行名称vs银行名称。不幸的是,我无法删除破折号,因为它是银行提供的公钥的名称 sGPGParms = " -e "; if (sUseGPGASCIIArmor.ToUpper() == "Y") {

我在努力解决一些我不太适应的问题时遇到了一些困难。我的问题似乎源于传递给Process.Start()的一个参数中的破折号/连字符。在下面的代码中,参数列表是根据数据库中的数据构建的。当sRecipient有破折号时,会发生此问题。例如,银行名称vs银行名称。不幸的是,我无法删除破折号,因为它是银行提供的公钥的名称

 sGPGParms = " -e ";
 if (sUseGPGASCIIArmor.ToUpper() == "Y")
 {
      sGPGParms += "-a ";
 }
 sGPGParms += "-r \"" + sRecipient + "\" \"" + sDestinationDir + sFileName + "\"";
代码的下一部分是出现故障的地方。程序正在使用Process.Start()传递路径和参数。程序没有陷入失败状态,并表示文件创建成功,但它什么也不做。今天早些时候,在银行提供了一个新的加密密钥并在名称中加了一个破折号之前,这段代码就工作了。这个破折号实际上是唯一的改变。这段代码自2008年以来一直有效,因此我将其与Process.Start()中的arguments参数以及破折号作为罪魁祸首对事物的影响隔离开来

Process myCmd;
               
if ((myCmd = Process.Start(Path, sGPGParms)) == null)
{
      LogEvent(sServerLogPath, "ERROR: GPG.exe failed to start", sUserName);
      SqlContext.Pipe.Send("GPG.exe failed to start");
}
else
{
      LogEvent(sServerLogPath, "Bank file created successfully", sUserName);
      SqlContext.Pipe.Send("Bann file created successfully");
      
}
作为补充说明,我可以运行从日志中复制的完整命令,它可以正常工作。它仅在通过Process.Start()时失败

这是一个手动运行的命令,但在通过没有公钥的Process.Start()时失败

"C:\Program Files (x86)\GNU\GnuPG\gpg2.exe" -e -r "Bank-Name" "c:\public\BankPay.txt"
你知道为什么这个破折号会引起问题吗


更新:通过分析评论中的一些建议,我发现我的退出代码为2,错误为未找到公钥。该键之所以存在,是因为我可以手动运行命令,并且在列出键时可以看到它。列出一些有助于诊断的内容:程序的退出代码是什么,以及输出是什么(
stderr
stdout
)。为
myCmd.ExitCode!=0应允许更详细的日志记录。还有,你是否有机会使用OpenPGP?在其上(靠近底部)有一个关于如何指定用户ID的部分,并且连字符似乎不是有效的单词字符。您可能需要以其他受支持的方式之一指定用户ID。在任何情况下,
进程
API都会将参数直接传递给进程,并且不会执行任何对连字符等敏感的筛选。@Jeff我们使用的是GNUpgp(gpg2.exe),如果在命令提示符下手动运行时它不起作用,我认为无效字符的问题是正确的。但是它是手动工作的。请注意,这是一个坏主意,最好使用路径。合并function@BenVoigt我不反对。这段代码是我之前写的,我看到了一些我计划解决的问题。在我能够解决为什么将公钥从一个没有破折号的公钥更改为一个有破折号的公钥这一关键问题之前,这些都不是真正相关的。