احصل على دليل العمل الحالي لـ cmd.exe
سؤال
كيف يمكنني استرداد دليل العمل الحالي لـ 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 ، والتي تكون موجودة دائمًا. ستحتاج إلى الحصول على بعض الهيكل هناك لإعادة النجاح/الفشل.
- الحصول على مقبض لعملية cmd.exe.
- تخصيص بعض الذاكرة هناك (VirtualAllocex)
- ضع المسار إلى DLL في الذاكرة. (WriteProcessMemory)
- قم بتحميل DLL في مساحة عنوان cmd.exe. (createremotethread مع نقطة دخول من مكتبة التحميل ، فإن الوسيطة هي الذاكرة التي خصصتها في وقت سابق.)
- يمنحك WaitforsingleObject متبوعًا بـ getExitCodetHread () ، hmodule من DLL الخاص بك في عملية cmd.exe.
- ReadProcessMemory للحصول على الدليل الحالي.
- قم بإلغاء تحميل DLL من مساحة عنوان cmd.exe. خيط createremote مع نقطة دخول من مكتبة ، فإن الوسيطة هي hmodule.
- 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.