cmd.exeの現在の作業ディレクトリを取得します
質問
cmd.exeの現在の作業ディレクトリを取得するにはどうすればよいですか?
これは可能だと思われます。たとえば、ProcessExplorerを使用して、CMD.exeを選択し、右クリックしてプロパティ、[画像]タブ、[現在のディレクトリ]を選択します。 CDまたはCHDIRコマンドを使用して設定されたディレクトリを反映します。
.NET ProcessおよびProcessStartInfoクラス(ProcessStartInfo.WorkingDirectoryは常に""を返します)を調べましたが、これを判断する方法が見つからないようです。 PInvoke でも目立つものはありません。
例として、プログラムで次のように言うことができるようにしたいと考えています:Process.GetCurrentWorkingDirectory(processID)processIDは、実行中の別のプロセスのWindowsプロセスIDです。
WinAPIまたは.NETのソリューションはありますか
[更新]
この質問をする理由:
「コマンドプロンプトエクスプローラーバー」を使用しましたしばらくの間、「CD」を除いて素晴らしいです新しいディレクトリに移動しても、現在のエクスプローラーウィンドウは変更されません。 (つまり、同期はエクスプローラーからコマンドプロンプトへの唯一の方法です)。この2つの方法を探しています。
解決
未検証、可能なアプローチ:
GetThreadStartInformation()を使用してバッファーのアドレスを検索するDllMainでDLLを作成し、GetCurrentDirectoryを使用してデータを設定します。これらの機能は両方とも常に存在するkernel32にあるため、これは問題ないはずです。成功/失敗を返すには、そこに何らかの構造が必要です。
- cmd.exeプロセスへのハンドルを取得します。
- そこにメモリを割り当てます(VirtualAllocEx)
- メモリへのDLLへのパスを入れます。 (WriteProcessMemory)
- dllをcmd.exeアドレス空間にロードします。 (LoadLibraryのエントリポイントを持つCreateRemoteThread、引数は以前に割り当てたメモリです。)
- WaitForSingleObjectにGetExitCodeThread()を続けると、cmd.exeプロセスでDLLのHMODULEが得られます。
- ReadProcessMemoryを使用して、現在のディレクトリを取得します。
- cmd.exeアドレススペースからdllをアンロードします。 FreeLibraryのエントリポイントを持つCreateRemoteスレッド、引数はHMODULEです。
- WaitForSingleObjectがDLLのアンロードを待機します。
広範なスケッチ:詳細は演習として残しました!リスク:cmd.exeアドレススペースにメモリを割り当て、その状態を変更します。 DllMainで呼び出される関数には注意が必要です。
他のヒント
バッチファイルの%CD%変数のことですか?
これに似ています:
set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
コマンドプロンプトで echo%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の記事" リモートプロセスの環境文字列を読む"役に立つかもしれません。
更新:これは解決策ではありません 。この回答へのコメントをご覧ください:" .Modules [0] .FileName(または MainModuile.FileName)は、 実行中の実行可能ファイルの場所 そのプロセス。私は探しています 現在の作業ディレクトリ( CDまたはCHDIRを使用して変更 コマンド)。"
System.Diagnostics名前空間を使用できます。 C#コンソールアプリケーションとしての例を次に示します。ファイル名からパス情報(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);
}
}
}
}
}
ここに私のマシンの出力があります(4つのコマンドラインを開きました):
代替テキストhttp://img236.imageshack.us/img236/3547/processworkingdirvn4 .png
この単純な環境プロパティを試してください:
Environment.CurrentDirectory()
同様の質問に対する私の回答を(自分で)参照してください。プロセス環境変数を読み取るコマンドラインユーティリティとC#ラッパーを作成しました。私の質問(Javaの現在のディレクトリを取得する)については、catalina_baseディレクトリを読むだけです。
これがcmd.exeに直接適用されるかどうかはわかりません。コードプロジェクトの記事で提供されているユーティリティは、cmd.exeで動作しませんでした。