
Der leere Zeichenfolgenwert „NoWorkingDirectory“ wird häufig in der Windows-Registrierung verwendet, wenn benutzerdefinierte Rechtsklickmenüelemente erstellt werden. Um beispielsweise PowerShell öffnen zu können, wenn Sie im Windows Explorer mit der rechten Maustaste auf den Ordnerhintergrund klicken (im Gegensatz zum Rechtsklick auf den Ordner selbst, in diesem Fall wird „NoWorkingDirectory“ nicht verwendet):
[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'"
Der eigentliche Zweck dieses Wertes ist mir jedoch nicht klar. In allen von mir gefundenen Beispielen wird er immer leer verwendet. Was genau bedeutet er?
Antwort1
WorkingDirectory ist eine Eigenschaft von System.Diagnostics.ProcessStartInfo. Wenn Sie mit der rechten Maustaste klicken, starten Sie einen neuen Prozess. Mit dieser Einstellung können Sie einen Prozess starten, ohne dass das aktuelle Verzeichnis zum „Arbeitsverzeichnis“ wird. Für den ausgeführten Befehl wird dann standardmäßig System32 verwendet.
Sie würden also „NoWorkingDirectory“ verwenden, wenn Sie nicht möchten, dass der mit der rechten Maustaste angeklickte Ort für die Dauer des Skripts Teil des Umgebungspfads wird. In 90 % der Fälle ist dies eine nutzlose Einstellung, es sei denn, Sie haben ähnlich benannte Dateien an mehreren Pfadorten, die sich als klebrig erweisen könnten, wenn „NoWorkingDirectory“ nicht angegeben wird.
Weitere Einzelheiten finden Sie hier.
Antwort2
Kurze Antwort für Windows-Benutzer ohne Programmierkenntnisse
Ausführen einer ausführbaren Datei mit einem (oder mehreren) Verzeichnis-/Dateinamen, die als Argument(e) an die ausführbare Datei über ein Shell-Kontextmenüelement übergeben werden, das durch Rechtsklick auf ein Verzeichnis oder eine Datei (auf der rechten Seite einesWindows-Datei-ExplorerFenster) führt zum Starten der ausführbaren Datei mit dem aktuellen Arbeitsverzeichnis für diese ausführbare Datei mit
- das Verzeichnis, das das angeklickte Verzeichnis/die angeklickte Datei enthält, ist kein Registrierungswert
NoWorkingDirectory
vorhanden
oder - das Verzeichnis
C:\Windows\System32
bzw. genauer gesagt%SystemRoot%\system32
mit dem in der Windows-Registrierung vorhandenen RegistrierungswertNoWorkingDirectory
.
Viele nicht gut codierte ausführbare Dateien und Skripte erfordern die erste Variante, wobei das aktuelle Arbeitsverzeichnis auf das Verzeichnis eingestellt wird, das das zu verarbeitende Verzeichnis oder die zu verarbeitende Datei enthält. Aus diesem Grund ist die erste Variante die Standardvariante.
In einigen Fällen verursacht die erste Variante ein unerwünschtes Verhalten, wie z. B. beim Ausführen cmd.exe
eines Batch-Skripts, dem der angeklickte Verzeichnis-/Dateiname als Argument übergeben wird und das Verzeichnis/die Datei über seinen/ihrenUNC-Pfad.
Die zweite Variante mit NoWorkingDirectory
Vorhandensein in der Windows-Registrierung kann für alle wirklich gut codierten ausführbaren Dateien und Skripte verwendet werden.
Lange Antwort für Windows-Benutzer und Programmierer, die an Details interessiert sind
Die Windows Kernel-Bibliothek enthält die FunktionProzess erstellendie von und den meisten anderen ausführbaren Dateien verwendet wird, explorer.exe
die eine andere ausführbare Datei ohne oder mit einem ausführen könnenSTARTUPINFOStruktur zum Starten einer ausführbaren Windows-Datei. Einer der Parameter der Funktion CreateProcess
ist lpCurrentDirectory
– ein langer Zeiger auf die Zeichenfolge mit dem Verzeichnispfad, der als aktuelles Arbeitsverzeichnis für den zu erstellenden Prozess festgelegt werden soll. Der Zeigerwert kann auch null sein, um anzuweisen, CreateProcess
das aktuelle Verzeichnis des aufrufenden Prozesses als aktuelles Arbeitsverzeichnis für den zu erstellenden Prozess zu verwenden . Die meisten ausführbaren Dateien werden mit einem Nullzeiger für den Funktionsparameter CreateProcess
aufgerufen .CreateProcess
lpCurrentDirectory
DerWindows-Datei-Explorer( explorer.exe
) ruft CreateProcess
mit dem Verzeichnispfad des Verzeichnisses auf, das das Verzeichnis/die Datei enthält, auf das/die der Benutzer mit der sekundären (normalerweise rechten) Taste des Zeigegeräts (häufig der Maustaste) geklickt hat, und klickte im geöffneten Kontextmenü auf das Element, wodurch eine ausführbare Datei mit dem angeklickten Verzeichnis-/Dateinamen als Argument gestartet wurde.
Der Registrierungszeichenfolgenwert NoWorkingDirectory
ändert das Verhalten bei explorer.exe
Aufrufen CreateProcess
in Bezug auf den Funktionsparameter lpCurrentDirectory
. Das aktuelle Verzeichnis ist bei Vorhandensein dieses Registrierungszeichenfolgenwerts immer das Systemverzeichnis von Windows, also das Verzeichnis, %SystemRoot%\System32
das auf den meisten Windows-Rechnern zu erweitert wird C:\Windows\System32
.
Das kann man wie folgt sehen:
Bitte öffnen Sie einEingabeaufforderungFenster und führen Sie die folgenden harmlosen Befehle aus:
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"
Die beiden reg
Befehlszeilen fügen der Windows-Registrierung Folgendes hinzu:
[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\""
Der Befehl md
und die vier echo
Befehlszeilen erstellen die Batchdatei C:\Temp\DirTest\DirTest.cmd
mit den folgenden Befehlszeilen:
@echo Batch file started with: %0 %*
@echo Current directory is: "%CD%"
@echo Command line used is: %CMDCMDLINE%
@pause
Starte jetztWindows-Datei-Explorerauf nicht bereits ausgeführt und navigieren Sie auf der linken Seite im Ordnerbaum zum Verzeichnis C:\Windows\System32\drivers
. Klicken Sie mit der rechten Maustasteauf der rechten Seiteauf den Ordner etc
und klicken Sie im geöffneten Kontextmenü mit der linken Maustaste auf den EintragKein Arbeitsverzeichnistestgerade zuvor zur Windows-Registrierung hinzugefügt.
Die zuvor erstellte Batchdatei wird ausgeführt und in einem Konsolenfenster angezeigt:
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"
Die erste Ausgabezeile zeigt das aktuelle Verzeichnis, das von CreateProcess
on gesetzt wurde, beginnend cmd.exe
mit den vier Argumenten gemäß der Zeichenfolge, die lpCurrentDirectory
vom übergeordneten Prozess mit übergeben wurde explorer.exe
. Es ist ersichtlich, dass dieWindows-Datei-ExplorerCreateProcess
wird in diesem Fall mit C:\Windows\System32\drivers
dem aktuellen Arbeitsverzeichnispfad aufgerufen .
Die zweite Ausgabezeile zeigt, mit welchen Argumenten die Batchdatei gestartet wurde, einschließlich des Arguments 0, bei dem es sich um die Zeichenfolge handelt, mit der auf die Batchdatei verwiesen wird, die der Windows-Registrierung hinzugefügt wurde.
Die dritte Zeile gibt aus, wie cmd.exe
es explorer.exe
bzw. gestartet wurde CreateProcess
, cmd.exe
obwohl es in der Registry ohne Umgebung gespeichert ist, wird es in „Beginnen mit“ "
eingeschlossen ."
explorer.exe
Der Registry-String-Wert NoWorkingDirectory
existiert momentan nicht. Aus diesem Grund cmd.exe
wird das aktuelle Arbeitsverzeichnis für auf gesetzt , das beim Rechtsklick C:\Windows\System32\drivers
das aktuelle Verzeichnis von ist.explorer.exe
auf der rechten Seiteauf dem Ordner etc
mit aktuell aktivem Ordner inWindows-Datei-ExplorerSein C:\Windows\System32\drivers
.
Klicken Sie nun mit der rechten Maustaste inWindows-Datei-Explorer auf der linken SeiteKlicken Sie im Ordnerbaum auf das Verzeichnis, C:\Windows
während der aktuell aktive Ordner noch aktiv ist, C:\Windows\System32\drivers
und klicken Sie im Kontextmenü mit der linken Maustaste auf das ElementKein Arbeitsverzeichnistest.
Es wird ein weiteres Konsolenfenster geöffnet, in dem die folgenden Zeilen angezeigt werden:
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"
Die zweite und dritte Zeile sind wie erwartet. Aber das aktuelle Verzeichnis ist weder C:\Windows\System32\drivers
noch C:\
und auch nicht C:\Windows
. Man sieht also, dass das Starten einer ausführbaren Datei mit dem Verzeichnis, das ein Verzeichnis enthält, nicht immer wie erwartet funktioniert, wenn der Benutzer im Ordnerbaum links mit der rechten Maustaste auf ein Verzeichnis oder einen virtuellen Shell-Ordner klickt.
Es ist auch ersichtlich, dass der aktuelle Arbeitsverzeichnispfad nicht einmal der tatsächliche Verzeichnispfad des Windows-Systemverzeichnisses ist, da in diesem Fall angezeigt würde C:\Windows\System32
und nicht C:\WINDOWS\system32
. Bitte beachten Sie die Unterschiede bei einigen Buchstaben. Der hier tatsächlich verwendete Windows-Systemverzeichnispfad ist eine Verkettung des Registrierungswerts SystemRoot
unter dem Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
, der den Zeichenfolgenwert C:\WINDOWS
mit der festen Zeichenfolge verkettet hat \system32
. Der tatsächliche Verzeichnispfad ist C:\Windows\System32
.
Eine Batchdatei oder ausführbare Datei oder ein anderes Skript, das von explorer.exe
ähnlichen Programmen über ein Kontextmenüelement ausgeführt werden soll, sollte immer berücksichtigen, dass das aktuelle Verzeichnis ein völlig anderes Verzeichnis sein kann als das Verzeichnis, das die übergebenen Verzeichnis-/Dateinamen enthält. Der aufrufende Prozess CreateProcess
definiert, welches Verzeichnis das aktuelle Verzeichnis für den erstellten Prozess ist.
cmd.exe
hat ein spezielles Verhalten, wenn es gestartet wird und der aktuelle Verzeichnispfad ein UNC-Pfad ist. Es ändert in diesem Fall das aktuelle Verzeichnis in %SystemRoot%
(Windows-Verzeichnis) und gibt die Informationen aus:
\\ComputerName\SharedFolder\Ressource
CMD.EXE wurde mit dem obigen Pfad als aktuelles Verzeichnis gestartet.
UNC-Pfade werden nicht unterstützt. Standardmäßig wird das Windows-Verzeichnis verwendet.
Dies geschieht aus cmd.exe
Gründen der Abwärtskompatibilität, da viele ausführbare Dateien auf dem aktuellen Verzeichnispfad, der nicht mit einem Laufwerksbuchstaben und einem Doppelpunkt beginnt, nicht korrekt ausgeführt werden.
Es ist möglich, Folgendes in einem Eingabeaufforderungsfenster auszuführen:
reg add "HKCU\Software\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 1 /f
Dadurch wird die UNC-Prüfung (Universal Naming Convention) für Befehlssitzungen deaktiviert und cmd.exe
auch ein aktuelles Verzeichnis mit einem UNC-Pfad akzeptiert.
Okay, zurück zum Registrierungswert NoWorkingDirectory
. Führen Sie ihn jetzt in einem Eingabeaufforderungsfenster aus:
reg add "HKCU\Software\Classes\Directory\shell\NoWorkingDirectoryTest" /v NoWorkingDirectory /t REG_SZ
Es wird der Registrierungsstringwert NoWorkingDirectory
ohne Wert hinzugefügt. Die Registrierung enthält nun also:
[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\""
Bitte beachten Sie, dass in der oben veröffentlichten Registrierungsausgabe die zusätzliche dritte Zeile fehlt.
InWindows-Datei-ExplorerRechtsklickauf der linken SeiteKlicken Sie im Verzeichnis C:\Windows
mit dem aktuell aktiven Ordner noch C:\Windows\System32\drivers
mit der linken Maustaste auf das KontextmenüelementKein Arbeitsverzeichnistestgenau wie vorher. Die Ausgabe ist wieder wie vorher. Es gibt also für diesen Anwendungsfall keine Änderung.
Klicken Sie mit der rechten Maustaste auf „Weiter“auf der rechten SeiteInWindows-Datei-Exploreretc
Klicken Sie im Verzeichnis C:\Windows\System32\drivers
auf den KontextmenüpunktKein Arbeitsverzeichnistest. Es öffnet sich ein Konsolenfenster mit den folgenden Zeilen:
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
Die erste Zeile zeigt den wichtigen Unterschied mit dem vorhandenen Registrierungsstring-Wert, der jetzt C:\WINDOWS\system32
statt C:\Windows\system32\drives
wie zuvor lautet. Das aktuelle Arbeitsverzeichnis ist jetzt immer das mit definierte Windows-Systemverzeichnis %SystemRoot%\system32
.
Es spielt keine Rolle, ob NoWorkingDirectory
der Registrierung ohne Zeichenfolgenwert oder mit einer Zeichenfolge wie hinzugefügt wird C:\Windows
. Es kann sogar ein Registrierungswert vom Typ DWORD
mit Namen NoWorkingDirectory
mit Wert 0
oder hinzugefügt werden 1
. Der Registrierungswerttyp NoWorkingDirectory
und sein Wert spielen für die Windows-Shell ( explorer.exe
) keine Rolle. Es ist nur wichtig, ob in der Windows-Registrierung unter dem für die Shell-Erweiterung verwendeten Schlüssel ein Registrierungswert mit Namen NoWorkingDirectory
vorhanden ist oder nicht.
Der hinzugefügte Registrierungsschlüssel und die Batchdatei können für weitere Analysen verwendet werden, z. B. zum Durchsuchen einer Netzwerkressource über einen UNC-Pfad oder zum Rechtsklicken auf einen virtuellen Shell-Ordner auf der linken Seite im Ordnerbaum. Es kann auch ein C:\Temp\DirTest
Verzeichnis mit Namen erstellt werden Development & Test(!) 100%
. Dieser Ordnername kann mit vollständigem Pfad an eine Batchdatei oder ausführbare Datei oder ein anderes Skript übergeben werden, um zu sehen, was passiert. Viele Batchdateien können eine Argumentzeichenfolge nicht korrekt verarbeiten, z. B. "C:\Temp\DirTest\Development & Test(!) 100%"
aufgrund von Leerzeichen, Ausrufezeichen, runden Klammern und einem Prozentzeichen, obwohl es sich um einen gültigen Verzeichnisnamen handelt, der nur aus ASCII-Zeichen besteht.
Der Registrierungsschlüssel und die Batchdatei sowie das erstellte Verzeichnis, das zur Demonstration des Verhaltens verwendet wurde, sollten abschließend gelöscht werden, indem Sie nach dem Schließen aller durch Ausführen geöffneten Konsolenfenster die folgenden Befehle im Eingabeaufforderungsfenster ausführen DirTest.cmd
:
reg delete "HKCU\Software\Classes\Directory\shell\NoWorkingDirectoryTest" /f
del C:\Temp\DirTest\DirTest.cmd
rd C:\Temp\DirTest
rd C:\Temp
Notiz:Viele der Eigenschaften einer Verknüpfungsdatei mit der Dateierweiterung .lnk
definieren die Werte, die vonForscherüber CreateProcess
seine Funktionsparameter und die Struktur STARTUPINFO
. Beispielsweise die EigenschaftStartet indefiniert den Zeichenfolgenwert, auf den lpCurrentDirectory
schließlich verweist, wenn die Verknüpfungsdatei zum Starten einer ausführbaren Datei verwendet wird.
Hinweis für Programmierer:
- Das C#Prozessklasseist eine C#-Wrapperklasse für
CreateProcess
. - Die JavaKlasse ProcessBuilderist unter Windows eine Java-Wrapperklasse für
CreateProcess
. - Die PythonUnterprozessmodulist unter Windows ein Python-Wrappermodul für
CreateProcess
. - Der Windows-Eingabeaufforderungsprozessor
start
unterstützt Optionen, die alleCreateProcess
beicmd.exe
ihrer Verwendung übergeben werden, wie etwa die Option/D
, die die Zeichenfolge definiert, dieCreateProcess
mit dem Funktionsparameter übergeben wirdlpCurrentDirectory
.
Jede Programmier- und Skriptsprache mit Unterstützung für die Ausführung einer ausführbaren Datei unter Windows verfügt über eine Funktion oder Klasse, die Windows CreateProcess
ohne oder mit einer STARTUPINFO
Struktur aufruft.
Antwort3
Die Verb-Eigenschaft „NoWorkingDirectory“ ist nicht dokumentiert, daher ist dies nur eine Vermutung:
Cmd.exe unterstützt keine Remote-Freigaben (UNC) als aktuelles Verzeichnis und wenn Sie Cmd.exe mit einem solchen Arbeitsverzeichnis starten, wird eine Warnmeldung auf der Konsole ausgegeben.
Wenn Sie sich die Registrierung „Eingabeaufforderung hier öffnen“ ansehen, werden Sie feststellen, dass Cmd.exe mit dem pushd
Befehl gestartet wird und pushd
UNC-Pfade unterstützt. NoWorkingDirectory dient lediglich dazu, die Anzeige einer Warnmeldung zu vermeiden.
Für PowerShell ist es nicht wirklich erforderlich.