
空の「NoWorkingDirectory」文字列値は、ユーザー定義の右クリック メニュー項目が作成されるときに、Windows レジストリでよく使用されます。たとえば、Windows エクスプローラーでフォルダーの背景を右クリックしたときに PowerShell を開くことができるようにする場合 (フォルダー自体を右クリックするのではなく、その場合は「NoWorkingDirectory」は使用されません) は次のようになります。
[HKEY_CLASSES_ROOT\Directory\Background\shell\powershell]
@="Open PowerShell Here"
"NoWorkingDirectory"=""
[HKEY_CLASSES_ROOT\Directory\Background\shell\powershell\command]
@="C:\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe -NoExit -Command Set-Location -LiteralPath '%V'"
しかし、この値の実際の目的はよく分かりません。私が見つけたすべてのサンプルで、この値は必ず空で使用されています。これは正確には何を意味するのでしょうか?
答え1
WorkingDirectory は System.Diagnostics.ProcessStartInfo のプロパティです。右クリックすると、新しいプロセスが開始され、この設定により、現在のディレクトリが「作業ディレクトリ」にならずにプロセスを開始できます。実行されるコマンドのデフォルトは System32 になります。
したがって、右クリックした場所をスクリプトの実行中に環境パスの一部にしたくない場合は、「NoWorkingDirectory」を使用します。「NoWorkingDirectory」を指定しないと問題が発生する可能性がある、複数のパスの場所に類似した名前のファイルがある場合を除き、90% のケースで役に立たない設定です。
詳細はこちらをご覧ください。
答え2
プログラミングスキルのないWindowsユーザー向けの短い回答
ディレクトリまたはファイルを右クリックして開くシェルコンテキストメニュー項目を介して実行可能ファイルに引数として渡された1つ(または複数)のディレクトリ/ファイル名を使用して実行可能ファイルを実行します(Windows ファイルエクスプローラーウィンドウ)を実行すると、実行可能ファイルが現在の作業ディレクトリに設定されて起動されます。
- クリックしたディレクトリ/ファイルを含むディレクトリにレジストリ値が
NoWorkingDirectory
存在しない
か、 - ディレクトリ
C:\Windows\System32
、より正確にはWindows レジストリに存在する%SystemRoot%\system32
レジストリ値。NoWorkingDirectory
適切にコード化されていない実行可能ファイルやスクリプトの多くは、最初のバリアントで現在の作業ディレクトリを、処理するディレクトリまたはファイルを含むディレクトリに設定する必要があります。これが、最初のバリアントがデフォルトになっている理由です。
最初のバリアントは、cmd.exe
クリックされたディレクトリ/ファイル名を引数として渡されるバッチスクリプトを実行する際に、ディレクトリ/ファイルがそのUNC パス。
NoWorkingDirectory
Windows レジストリに存在する2 番目のバリアントは、すべての適切にコード化された実行可能ファイルとスクリプトに使用できます。
詳細に興味のあるWindowsユーザーとプログラマー向けの長い回答
Windowsカーネルライブラリには関数が含まれていますプロセスの作成explorer.exe
これは、他のほとんどの実行可能ファイルで使用され、他の実行可能ファイルを実行することができます。スタートアップ情報Windows 実行可能ファイルを起動する構造体。関数のパラメータの 1 つは、プロセスが作成する現在の作業ディレクトリとして設定するディレクトリ パスを含む文字列への長いポインタCreateProcess
です。ポインタ値を null にして、プロセス呼び出しの現在のディレクトリを、プロセスが作成する現在の作業ディレクトリとして使用するように指示することもできます。ほとんどの実行可能ファイルは、関数パラメータに null ポインタを使用して呼び出します。lpCurrentDirectory
CreateProcess
CreateProcess
CreateProcess
lpCurrentDirectory
のWindows ファイルエクスプローラー( explorer.exe
) はCreateProcess
、ユーザーがセカンダリ (通常は右) ポインティング デバイス (多くの場合マウス) ボタンでクリックし、開いたコンテキスト メニューで項目をクリックしたディレクトリ/ファイルを含むディレクトリのディレクトリ パスを使用して呼び出し、クリックしたディレクトリ/ファイル名を引数として実行可能ファイルを起動します。
レジストリ文字列値は、関数パラメータ に関する呼び出しNoWorkingDirectory
の動作を変更します。現在のディレクトリは常に、このレジストリ文字列値が存在する Windows のシステム ディレクトリ、つまりほとんどの Windows マシンで に展開されるディレクトリです。explorer.exe
CreateProcess
lpCurrentDirectory
%SystemRoot%\System32
C:\Windows\System32
それは次のようにわかります。
開いてくださいコマンド・プロンプトウィンドウを開き、次の無害なコマンドを実行します。
reg add "HKCU\Software\Classes\Directory\shell\NoWorkingDirectoryTest" /ve /d "No working directory test"
reg add "HKCU\Software\Classes\Directory\shell\NoWorkingDirectoryTest\command" /ve /d "cmd.exe /D /C C:\Temp\DirTest\DirTest.cmd \"%V"\""
md "C:\Temp\DirTest"
echo @echo Current directory is: ^"%^CD%^">"C:\Temp\DirTest\DirTest.cmd"
echo @echo Batch file started with: %0 %*>>"C:\Temp\DirTest\DirTest.cmd"
echo @echo Command line used is: %^CMDCMDLINE%>>"C:\Temp\DirTest\DirTest.cmd"
echo @pause>>"C:\Temp\DirTest\DirTest.cmd"
次の 2 つのreg
コマンド ラインは Windows レジストリに追加されます。
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\NoWorkingDirectoryTest]
@="No working directory test"
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\NoWorkingDirectoryTest\command]
@="cmd.exe /D /C \"C:\\Temp\\DirTest\\DirTest.cmd\" \"%V\""
コマンドmd
と 4 つのコマンド ラインにより、次のコマンド ラインを含むecho
バッチ ファイルが作成されます。C:\Temp\DirTest\DirTest.cmd
@echo Batch file started with: %0 %*
@echo Current directory is: "%CD%"
@echo Command line used is: %CMDCMDLINE%
@pause
今すぐ始めましょうWindows ファイルエクスプローラー実行されていない場合は、左側のフォルダツリーでディレクトリを参照しますC:\Windows\System32\drivers
。マウスの右ボタンでクリックします。右側フォルダ上でetc
、開いたコンテキストメニューでアイテムを左クリックします作業ディレクトリテストなし先ほど Windows レジストリに追加しました。
直前に作成されたバッチ ファイルが実行され、コンソール ウィンドウに表示されます。
Current directory is: "C:\Windows\System32\drivers"
Batch file started with: C:\Temp\DirTest\DirTest.cmd "C:\Windows\System32\drivers\etc"
Command line used is: "cmd.exe" /D /C C:\Temp\DirTest\DirTest.cmd "C:\Windows\System32\drivers\etc"
最初の出力行は、親プロセスから渡された文字列に従って4つの引数でCreateProcess
開始して、によって設定された現在のディレクトリを示しています。cmd.exe
lpCurrentDirectory
explorer.exe
Windows ファイルエクスプローラーCreateProcess
この場合、C:\Windows\System32\drivers
現在の作業ディレクトリ パスとして呼び出されます。
2 番目の出力行には、Windows レジストリに追加されたバッチ ファイルを参照するために使用される文字列である引数 0 を含む、バッチ ファイルがどの引数で開始されたかが表示されます。
3 行目は、それぞれcmd.exe
によって起動された方法を出力します。によって起動されると、 で囲まれてレジストリに格納されます。explorer.exe
CreateProcess
cmd.exe
"
"
explorer.exe
レジストリ文字列の値は現時点では存在しません。これが、右クリックすると現在のディレクトリであるの現在の作業ディレクトリがに設定されているNoWorkingDirectory
理由です。cmd.exe
C:\Windows\System32\drivers
explorer.exe
右側etc
現在アクティブなフォルダがあるフォルダWindows ファイルエクスプローラーいるC:\Windows\System32\drivers
。
右クリックしてWindows ファイルエクスプローラー 左側C:\Windows
現在アクティブなフォルダが静止しているときにディレクトリのフォルダツリーでC:\Windows\System32\drivers
、項目のコンテキストメニューを左クリックします。作業ディレクトリテストなし。
次の行を表示するもう 1 つのコンソール ウィンドウが開きます。
Current directory is: "C:\WINDOWS\system32"
Batch file started with: C:\Temp\DirTest\DirTest.cmd "C:\Windows"
Command line used is: "cmd.exe" /D /C C:\Temp\DirTest\DirTest.cmd "C:\Windows"
2 行目と 3 行目は予想どおりです。ただし、現在のディレクトリは でも でもC:\Windows\System32\drivers
なくC:\
、でもありませんC:\Windows
。そのため、ユーザーがディレクトリまたは仮想シェル フォルダの左側のフォルダ ツリーを右クリックした場合、ディレクトリを含むディレクトリで実行可能ファイルを起動することは必ずしも予想どおりに機能しないことがわかります。
また、現在の作業ディレクトリ パスは、Windows システム ディレクトリの実際のディレクトリ パスではないこともわかります。この場合、 が表示され、 は表示されC:\Windows\System32
ません。一部の文字の違いに注意してください。ここで実際に使用される Windows システム ディレクトリ パスは、固定文字列 と連結された文字列値を持つキーの下のC:\WINDOWS\system32
レジストリ値の連結です。実際のディレクトリ パスは です。SystemRoot
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
C:\WINDOWS
\system32
C:\Windows\System32
コンテキスト メニュー項目を介して、または同様のプログラムによって実行されるように設計されたバッチ ファイル、実行可能ファイル、またはその他のスクリプトexplorer.exe
では、現在のディレクトリが、渡されたディレクトリ/ファイル名を含むディレクトリとはまったく異なるディレクトリになる可能性があることを常に考慮する必要があります。プロセス呼び出しによって、CreateProcess
作成されたプロセスの現在のディレクトリが定義されます。
cmd.exe
現在のディレクトリ パスが UNC パスである状態で起動すると、特別な動作をします。この場合、現在のディレクトリを%SystemRoot%
(Windows ディレクトリ) に変更し、次の情報を出力します。
\\ComputerName\SharedFolder\Resource
CMD.EXE は、上記のパスを現在のディレクトリとして起動されました。UNC
パスはサポートされていません。Windows ディレクトリがデフォルトになります。
cmd.exe
これは、多くの実行可能ファイルがドライブ文字とコロンで始まっていない現在のディレクトリ パス上で正しく実行されないため、下位互換性のために行われます。
コマンドプロンプトウィンドウで実行することも可能です:
reg add "HKCU\Software\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 1 /f
これにより、コマンド セッションの汎用命名規則 (UNC) チェックが無効になり、cmd.exe
UNC パスを持つ現在のディレクトリも受け入れられます。
さて、レジストリ値に戻りましょうNoWorkingDirectory
。コマンドプロンプトウィンドウで実行します。
reg add "HKCU\Software\Classes\Directory\shell\NoWorkingDirectoryTest" /v NoWorkingDirectory /t REG_SZ
値のないレジストリ文字列値が追加されましたNoWorkingDirectory
。したがって、レジストリには現在次の内容が含まれています:
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\NoWorkingDirectoryTest]
@="No working directory test"
"NoWorkingDirectory"=""
[HKEY_CURRENT_USER\Software\Classes\Directory\shell\NoWorkingDirectoryTest\command]
@="cmd.exe /D /C C:\\Temp\\DirTest\\DirTest.cmd \"%V\""
上記のレジストリ出力では、追加の 3 行目が欠落していることに注意してください。
でWindows ファイルエクスプローラー右クリック左側C:\Windows
現在アクティブなフォルダが静止しているディレクトリでC:\Windows\System32\drivers
、コンテキストメニュー項目を左クリックします作業ディレクトリテストなし以前とまったく同じです。出力も以前と同じです。したがって、このユースケースでは変更はありません。
右クリックして次へ右側でWindows ファイルエクスプローラーディレクトリのetc
コンテキストC:\Windows\System32\drivers
メニュー項目を左クリックします作業ディレクトリテストなしコンソール ウィンドウが開き、次の行が表示されます。
Current directory is: "C:\WINDOWS\system32"
Batch file started with: C:\Temp\DirTest\DirTest.cmd "C:\Windows\System32\drivers\etc"
Command line used is: "cmd.exe" /D /C C:\Temp\DirTest\DirTest.cmd "C:\Windows\System32\drivers\etc"
最初の行は、以前の ではなく がNoWorkingDirectory
存在するレジストリ文字列値との重要な違いを示しています。現在の作業ディレクトリは常に で定義された Windows システム ディレクトリになります。C:\WINDOWS\system32
C:\Windows\system32\drives
%SystemRoot%\system32
NoWorkingDirectory
が文字列値なしでレジストリに追加されるか、 のような文字列値で追加されるかは関係ありません。または を持つ、名前のタイプのレジストリ値を追加することもC:\Windows
できます。 のレジストリ値タイプとその値は、Windows シェル ( ) では関係ありません。シェル拡張に使用されているキーの下の Windows レジストリに、名前のレジストリ値が存在するかどうかだけが関係します。DWORD
NoWorkingDirectory
0
1
NoWorkingDirectory
explorer.exe
NoWorkingDirectory
追加されたレジストリ キーとバッチ ファイルは、UNC パスを使用してネットワーク リソースを参照したり、フォルダー ツリーの左側にある仮想シェル フォルダーを右クリックするなど、さらに多くの分析に使用できます。C:\Temp\DirTest
名前の付いたディレクトリを作成しDevelopment & Test(!) 100%
、このフォルダー名をバッチ ファイルまたは実行可能ファイルまたはその他のスクリプトにフル パスで渡して、何が起こるかを確認することもできます。多くのバッチ ファイルは、"C:\Temp\DirTest\Development & Test(!) 100%"
ASCII 文字のみで構成された有効なディレクトリ名であるにもかかわらず、スペース、感嘆符、丸括弧、パーセント記号などのため、引数文字列を正しく処理できません。
レジストリ キーとバッチ ファイル、および動作のデモンストレーションに使用された作成されたディレクトリは、次のコマンドを実行して開いたすべてのコンソール ウィンドウを閉じた後、コマンド プロンプト ウィンドウで次のコマンドを実行して最終的に削除する必要がありますDirTest.cmd
。
reg delete "HKCU\Software\Classes\Directory\shell\NoWorkingDirectoryTest" /f
del C:\Temp\DirTest\DirTest.cmd
rd C:\Temp\DirTest
rd C:\Temp
注記:ファイル拡張子を持つショートカットファイルのプロパティの多くは.lnk
、冒険者CreateProcess
関数パラメータと構造体を介してに渡されますSTARTUPINFO
。たとえば、プロパティで開始lpCurrentDirectory
ショートカット ファイルを使用して実行可能ファイルを起動するときに最終的に指す文字列値を定義します。
プログラマー向けの注意:
- C#のプロセスクラスは、の C# ラッパー クラスです
CreateProcess
。 - ジャワクラス ProcessBuilderは、Windows 上の の Java ラッパー クラスです
CreateProcess
。 - パイソンサブプロセスモジュールは、Windows 上の の Python ラッパー モジュールです
CreateProcess
。 - Windows コマンド プロセッサ コマンドは、関数パラメータを使用してに渡される文字列を定義するオプションのように、使用時にに
start
渡されるすべてのオプションをサポートします。CreateProcess
cmd.exe
/D
CreateProcess
lpCurrentDirectory
CreateProcess
Windows 上で実行可能ファイルを実行するためのサポートを備えたすべてのプログラミング言語とスクリプト言語には、構造体の有無にかかわらずWindows 上で呼び出す関数またはクラスがありますSTARTUPINFO
。
答え3
「NoWorkingDirectory」動詞プロパティは文書化されていないため、これは単なる推測です。
Cmd.exe は、現在のディレクトリとしてリモート共有 (UNC) をサポートしていないため、そのような作業ディレクトリで Cmd.exe を起動すると、コンソールに警告メッセージが表示されます。
「ここでコマンド ウィンドウを開く」登録を見ると、コマンドで Cmd.exe が起動されpushd
、pushd
UNC パスがサポートされていることがわかります。NoWorkingDirectory は、警告メッセージが表示されないようにするために存在します。
PowerShell では実際には必要ありません。