سؤال

كيف يمكنني استرداد دليل العمل الحالي لـ cmd.exe؟

هذا يبدو ممكنا. على سبيل المثال ، باستخدام ProcessExplorer ، حدد cmd.exe ، انقر بزر الماوس الأيمن ، والخصائص ، وعلامة تبويب الصورة ، "الدليل الحالي" يقوم بإزالة مجموعة الدليل باستخدام أوامر CD أو CHDIR.

لقد نظرت إلى فصول .NET و ProcessStartInfo (ProcessStartInfo.WorkingDirectory دائمًا ما تُرجع "") ولا يمكن أن تجد طريقة لتحديد ذلك. لا شيء في بينفوك يبرز أيضًا.

على سبيل المثال ، أتطلع إلى أن أكون قادرًا على قول شيء مثل: Process.getCurrentWorkingDirectory (ProcessId) حيث يكون ProcessID معرف عملية Windows لعملية تشغيل أخرى.

هل هناك أي حل ، winapi أو .NET؟

تحديث

سبب لطرح هذا السؤال:

لقد استخدمت "شريط أوامر موجه Explorer" لفترة من الوقت وهو رائع إلا إذا كنت "قرص مضغوط" إلى دليل جديد ، فإن نافذة Explorer الحالية لا تتغير أيضًا. (أي أن المزامنة هي طريقة واحدة فقط من المستكشف إلى موجه commmand). أنا أتطلع إلى جعل هذه الطريقة 2.

هل كانت مفيدة؟

المحلول

لم يخبر ، نهج محتمل:

قم بإنشاء DLL باستخدام dllmain الذي يستخدم getThReadStartInformation () للعثور على عنوان المخزن المؤقت ، ثم يستخدم getCurrentDirectory لملءه. يجب أن يكون هذا على ما يرام ، لأن كلتا الوظيفتين موجودة في kernel32 ، والتي تكون موجودة دائمًا. ستحتاج إلى الحصول على بعض الهيكل هناك لإعادة النجاح/الفشل.

  1. الحصول على مقبض لعملية cmd.exe.
  2. تخصيص بعض الذاكرة هناك (VirtualAllocex)
  3. ضع المسار إلى DLL في الذاكرة. (WriteProcessMemory)
  4. قم بتحميل DLL في مساحة عنوان cmd.exe. (createremotethread مع نقطة دخول من مكتبة التحميل ، فإن الوسيطة هي الذاكرة التي خصصتها في وقت سابق.)
  5. يمنحك WaitforsingleObject متبوعًا بـ getExitCodetHread () ، hmodule من DLL الخاص بك في عملية cmd.exe.
  6. ReadProcessMemory للحصول على الدليل الحالي.
  7. قم بإلغاء تحميل DLL من مساحة عنوان cmd.exe. خيط createremote مع نقطة دخول من مكتبة ، فإن الوسيطة هي hmodule.
  8. waitforsingleObject لانتظار لتفريغ DLL.

رسم واسع: تبقى التفاصيل باعتبارها تمرينًا! المخاطر: يخصص الذاكرة في مساحة عنوان cmd.exe ، ويغير حالتها. يجب توخي الحذر مع الوظائف التي تسمى في dllmain.

نصائح أخرى

هل تقصد متغير ٪ CD ٪ في ملف الدُفعة؟

مثله:

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

محاولة صدى ٪ CD ٪ في موجه الأوامر. قون

وكذلك هذا ما تحتاجه ، يوجد هنا PowerShell وظيفة للقيام بذلك:

$(get-location)

أتمنى أن يساعدك هذا.

لقد وجدت كل شيء من هنا.

ربما هذا إدخال المنتدى في منتدى sysinternals يحتوي على تلميح إلى الحل. ابحث عن هذا في وظيفة getProcessStrings:

// 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 "اقرأ سلاسل البيئة من العملية البعيدة"يمكن أن تكون مفيدة أيضا.

تحديث: هذا هو ليس الحل ، انظر التعليقات على هذه الإجابة: "كما قال Janm. modules [0]. اسم Filename (أو mainmoduile.filename) يعطي موقع التشغيل القابل للتنفيذ في تلك العملية. أتطلع إلى العثور على دليل العمل الحالي (يمكن تغييره باستخدام أوامر القرص المضغوط أو CHDIR) "

يمكنك استخدام System.Diagnostics مساحة الاسم. هنا مثال على أنه تطبيق C# Console. من اسم الملف ، يمكنك بسهولة استخراج معلومات المسار (System.io.path ...).

سوف تتأكد من امتلاك الأذونات (تشغيل كمسؤول) للقيام بذلك.

أتمنى أن يساعدك هذا. ها هو رمز العمل (تم اختباره):

using System;
using System.Diagnostics;
using System.IO;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Process[] procList =  Process.GetProcessesByName("cmd");

            string sFileName;

            for (int i = 0; i < procList.Length; i++ )
            {
                Console.Write(procList[i].Id);
                Console.Write(" ");

                try
                {
                    sFileName = procList[i].Modules[0].FileName;
                    Console.Write("(");
                    Console.Write(Path.GetFileName(sFileName));
                    Console.Write("): ");
                    Console.WriteLine(Path.GetDirectoryName(sFileName));
                }
                catch (Exception ex)
                {
                    // catch "Access denied" etc.
                    Console.WriteLine(ex.Message);
                }


            }

        }
    }
}

هنا انتاج على الجهاز الخاص بي (فتحت أربعة خطوط قيادة):

alt text http://img236.imageshack.us/img236/3547/processworkingdirvn4.png

جرب خاصية البيئة البسيطة:

البيئة. CurrentDirectory ()

نرى إجابتي إلى سؤال مماثل (بنفسي). كتبت أداة سطر الأوامر و c# closper لقراءة متغيرات بيئة العملية. لسؤالي (الحصول على DIR الحالي لـ Java) ، قرأت ببساطة دليل Catalina_Base.

لست متأكدًا مما إذا كان هذا ينطبق مباشرة على cmd.exe. فشلت الأداة المساعدة المقدمة في مقالة مشروع الكود في العمل مع cmd.exe.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top