Получите текущий рабочий каталог для cmd.exe

Вы можете использовать System.Linq для управления этим.

int splitByCount = 2;
string s = new List<string> { "DVMNLS", "DVMNLS" };

var split = s.SelectMant(c => c) //flatten the list of strings to IEnumerable<char>
    .Select((c, index) => new {c, index})
    .GroupBy(x => x.index/splitByCount)
    .Select(group => group.Select(elem => elem.c))
    .Select(chars => new string(chars.ToArray()));

Console.WriteLine(string.Join(",", split));

выход

DV,MN,KL,DV,MN,KL
16
задан Ash 25 January 2010 в 08:29
поделиться

6 ответов

Непротестированный, возможный подход:

Создайте DLL с DllMain, который использует GetThreadStartInformation () для нахождения адреса буфера и затем использует GetCurrentDirectory для заполнения его. Это должно быть в порядке, потому что обе из тех функций находятся в kernel32, который всегда присутствует. У Вас должна будет быть некоторая структура там для возврата успеха/отказа.

  1. Получите дескриптор к процессу cmd.exe.
  2. Выделите некоторую память там (VirtualAllocEx)
  3. Поместите путь к своему DLL в памяти. (WriteProcessMemory)
  4. Загрузите свой dll в адресное пространство cmd.exe. (CreateRemoteThread с точкой входа LoadLibrary, аргументом является память, которую Вы выделили ранее.)
  5. WaitForSingleObject, сопровождаемый GetExitCodeThread (), дает Вам HMODULE Вашего DLL в процессе cmd.exe.
  6. ReadProcessMemory для получения текущего каталога.
  7. Разгрузите свой dll от адресного пространства cmd.exe. Поток CreateRemote с точкой входа FreeLibrary, аргументом является HMODULE.
  8. WaitForSingleObject для ожидания DLL для разгрузки.

Широкий эскиз: Детали, оставленные как осуществление! Риски: Выделяет память в адресном пространстве cmd.exe, изменяет его состояние. Необходимо соблюдать осторожность о функциях, вызванных в DllMain.

6
ответ дан 30 November 2019 в 22:24
поделиться

Вы имеете в виду %CD переменную % в пакетном файле?

Как это:

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

Попробуйте эхо %CD % в командной строке.:)

Хорошо, поскольку это - то, в чем Вы нуждаетесь, там вот функция PowerShell, чтобы сделать это:

$(get-location)

Надеюсь, это поможет.

Я нашел все это отсюда.

5
ответ дан 30 November 2019 в 22:24
поделиться

Возможно, эта запись форума на Форуме 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 "Читала, Строки Среды Удаленного процесса" могли быть полезными также.

5
ответ дан 30 November 2019 в 22:24
поделиться

Попробуйте это простое свойство среды:

Среда. CurrentDirectory ()

1
ответ дан 30 November 2019 в 22:24
поделиться

ОБНОВЛЕНИЕ: Это не решение, см. комментарии к этому ответу: "Как Janm сказал что.Modules[0].FileName (или MainModuile. FileName), дает местоположение исполняемого файла, работающего в том процессе. Я надеюсь находить текущий рабочий каталог (который может быть изменен с помощью CD или команд CHDIR)".

Вы могли использовать Систему. Пространство имен диагностики. Здесь пример как консольное приложение C#. От имени файла можно легко извлечь информацию о Пути (Система. 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);
                }


            }

        }
    }
}

Здесь вывод на моей машине (я открыл четыре командных строки):

сопроводительный текст http://img236.imageshack.us/img236/3547/processworkingdirvn4.png

2
ответ дан 30 November 2019 в 22:24
поделиться

См. мой ответ на подобный вопрос (один). Я записал утилиту командной строки и обертку C# для чтения переменных среды процесса. Для моего вопроса (получение текущего dir для Java), я просто прочитал catalina_base каталог.

Я не уверен, применяется ли это непосредственно к cmd.exe. Утилите, обеспеченной в статье Code Project, не удалось работать с cmd.exe.

0
ответ дан 30 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: