Вы можете использовать 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
Непротестированный, возможный подход:
Создайте DLL с DllMain, который использует GetThreadStartInformation () для нахождения адреса буфера и затем использует GetCurrentDirectory для заполнения его. Это должно быть в порядке, потому что обе из тех функций находятся в kernel32, который всегда присутствует. У Вас должна будет быть некоторая структура там для возврата успеха/отказа.
Широкий эскиз: Детали, оставленные как осуществление! Риски: Выделяет память в адресном пространстве 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 "Читала, Строки Среды Удаленного процесса" могли быть полезными также.
Попробуйте это простое свойство среды:
Среда. CurrentDirectory ()
ОБНОВЛЕНИЕ: Это не решение, см. комментарии к этому ответу: "Как 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
См. мой ответ на подобный вопрос (один). Я записал утилиту командной строки и обертку C# для чтения переменных среды процесса. Для моего вопроса (получение текущего dir для Java), я просто прочитал catalina_base каталог.
Я не уверен, применяется ли это непосредственно к cmd.exe. Утилите, обеспеченной в статье Code Project, не удалось работать с cmd.exe.