.net 获取cmd.exe的当前工作目录

.net 获取cmd.exe的当前工作目录,.net,winapi,directory,cmd,.net,Winapi,Directory,Cmd,如何检索cmd.exe的当前工作目录 这似乎是可能的。例如,使用ProcessExplorer,选择CMD.exe,右键单击“属性”、“图像”选项卡,“当前目录”使用CD或CHDIR命令释放目录集 我查看了.NET进程和ProcessStartInfo类(ProcessStartInfo.WorkingDirectory始终返回“”),似乎找不到确定这一点的方法。在这方面也没有什么突出的地方 作为一个例子,我希望通过编程能够说:Process.GetCurrentWorkingDirectory

如何检索cmd.exe的当前工作目录

这似乎是可能的。例如,使用ProcessExplorer,选择CMD.exe,右键单击“属性”、“图像”选项卡,“当前目录”使用CD或CHDIR命令释放目录集

我查看了.NET进程和ProcessStartInfo类(ProcessStartInfo.WorkingDirectory始终返回“”),似乎找不到确定这一点的方法。在这方面也没有什么突出的地方


作为一个例子,我希望通过编程能够说:Process.GetCurrentWorkingDirectory(processID),其中processID是另一个正在运行的进程的Windows进程ID

有没有解决方案,WinAPI或.NET

[更新]

提出此问题的原因:


我已经使用“命令提示符资源管理器栏”一段时间了,它非常棒,除非我将“CD”转到一个新目录,当前的资源管理器窗口也不会改变。(即从资源管理器到命令提示符的同步仅为1路)。我希望将此设置为双向。

您是指批处理文件中的%CD%变量吗

像这样:

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
在命令提示符下尝试回显%CD%。)

这正是您所需要的,这里有一个PowerShell函数来执行此操作:

$(get-location)
希望这有帮助


我发现这一切都来自。

未经测试,一种可能的方法:

使用DllMain创建一个DLL,该DLL使用GetThreadStartInformation()查找缓冲区的地址,然后使用GetCurrentDirectory填充它。这应该是可以的,因为这两个函数都在kernel32中,它总是存在的。你需要有一些结构来返回成功/失败

  • 获取cmd.exe进程的句柄
  • 在那里分配一些内存(VirtualAllocEx)
  • 将DLL的路径放入内存中。(WriteProcessMemory)
  • 将dll加载到cmd.exe地址空间。(入口点为LoadLibrary的CreateRemoteThread,参数是您先前分配的内存。)
  • WaitForSingleObject后跟GetExitCodeThread(),提供cmd.exe进程中DLL的HMODULE
  • ReadProcessMemory以获取当前目录
  • 从cmd.exe地址空间卸载dll。CreateRemote线程,入口点为FreeLibrary,参数为HMODULE
  • WaitForSingleObject等待DLL卸载
  • 大草图:细节留作练习!风险:在cmd.exe地址空间中分配内存,更改其状态。必须注意DllMain中调用的函数

    更新:这是而不是解决方案,请参阅对此答案的评论:“正如Janm所说 .Modules[0]。文件名(或 MainModuile.FileName)提供 在中运行的可执行文件的位置 这个过程,我在寻找答案 当前工作目录(可以是 使用CD或CHDIR更改 命令)。”

    您可以使用System.Diagnostics命名空间。这里是一个C#控制台应用程序示例。从文件名中可以轻松提取路径信息(System.IO.Path…)

    您将确保具有执行此操作的权限(以管理员身份运行)

    希望这有帮助。以下是工作代码(已测试):

    使用系统;
    使用系统诊断;
    使用System.IO;
    名称空间测试
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    Process[]procList=Process.GetProcessesByName(“cmd”);
    字符串sFileName;
    for(int i=0;i
    这里是我机器上的输出(我打开了四个命令行):

    这可能包含解决方案的提示。在GetProcessString函数中查找:

    // Get Command Line Block
    
    // At offset 0x00020498 is the process current directory followed by
    
    // the system PATH. After that is the process full command line, followed
    
    // by the exe name and the windows station it's running on.
    
    这篇CodeProject文章“”也可能很有用。

    请(我自己)回答一个类似的问题。我编写了一个命令行实用程序和C#包装器来读取流程环境变量。对于我的问题(获取java的当前目录),我只需阅读catalina_基本目录


    我不确定这是否直接适用于cmd.exe。代码项目文章中提供的实用程序无法使用cmd.exe。

    请尝试以下简单的环境属性:


    Environment.CurrentDirectory()

    我希望通过编程可以说:Process.GetCurrentWorkingDirectory(processID),其中processID是windows进程ID。您所要求的听起来有些可疑。除非您正在测试(QA)或调试,否则一个流程不应该干扰另一个流程。将其用于“生产”或商业软件是不好的,因为它需要特权。这是你的产品得不到的。那个么,你们想完成什么?公平的问题。没什么可疑的。我已经使用“命令提示符资源管理器栏”一段时间了,它非常棒,除非我将“CD”转到一个新目录,当前的资源管理器窗口也不会改变。(即从资源管理器到命令提示符的同步仅为1路)。我希望实现这2种方式。我需要这个用于测试目的-我想杀死一个java Tomcat进程,并用它作为区别于其他方式的一种方式。这不起作用!这将给出模块的目录,而不是进程的当前目录。在测试中,其中一行应该是C:\Users\s
    // Get Command Line Block
    
    // At offset 0x00020498 is the process current directory followed by
    
    // the system PATH. After that is the process full command line, followed
    
    // by the exe name and the windows station it's running on.