C# 获取另一个进程的工作目录

11
我想通过读取命令行来确定已知进程使用文件的绝对路径。目前,该进程在命令行中使用相对路径指向各种文件(例如配置文件)。问题在于,如果这些路径与包含可执行文件的文件夹无关,则我没有办法将命令行提供的相对路径转换为绝对路径,因为我不能100%确定。
例如,两个批处理文件:
BATCH 1 CD c:\test\bin test.exe ..\config\config.ini
BATCH 2 CD c:\test bin\test.exe config\config.ini
对于批处理文件一,我得到的命令行是“c:\ test \ bin \ test.exe .. \ config \ config.ini”,对于批处理文件二,我得到的是“c:\ test \ bin \ test.exe config \ config.ini”。所以,我无法解析这些路径。
总之,首先,我从WMI查询中使用ManagementObjectSearcher获取了命令行。现在我需要获取启动进程的工作目录,以解析在命令行传递的路径,但是如何获取?
编辑:我忘记了一个关键细节。我想获取另一个进程的工作目录。基本上,我的主程序从另一个程序中收集信息。我能够确定进程ID,因为我知道可执行文件的名称。我还可以确定命令行。现在我必须找到可执行文件启动时的工作目录或当前目录,以便解析命令行的相对路径。我希望我的问题更清晰一些。

1
我认为问题标题并不完全是你所问的。 "获取进程工作目录"是一个关于工作目录的问题,它可以在执行过程中发生变化,但问题本身似乎是在询问可执行文件启动时的目录,这可能会非常不同(并且在进程执行期间不会更改)。 @chris166的答案解决了您的问题标题,但我的答案解决了问题本身,仅代表个人意见。也许您可以澄清混淆? - Cyberherbalist
3个回答

6
我认为Environment.CurrentDirectory应该可以给你启动可执行文件的目录。但是它只在进程开始时可靠,因为后面可能会更改。
或者尝试一下Process.GetCurrentProcess().StartInfo.WorkingDirectory。我自己没有尝试过,只是在MSDN上查找到的。

我在控制台应用程序中尝试了所有这些内容,Environment.CurrentDirectory输出的是应用程序启动的目录,就像你想的那样。但是Process.GetCurrentProcess().StartInfo.WorkingDirectory输出为空字符串,这让我很惊讶——我本以为它会是一样的。稍微进一步的测试表明,如果我创建一个可执行文件的快捷方式,然后修改快捷方式的“起始位置”属性为某个值(例如“C:\”),那么StartInfo.WorkingDirectory中就会出现该值。 - Cyberherbalist

3

0
你尝试过Application.ExecutablePath吗?
另外,有很多路径可以从Application检索。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接