Was bedeutet der Zeichenfolgenwert „NoWorkingDirectory“ in der Windows-Registrierung?

Was bedeutet der Zeichenfolgenwert „NoWorkingDirectory“ in der Windows-Registrierung?

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.

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory%28v=vs.110%29.aspx

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

  1. das Verzeichnis, das das angeklickte Verzeichnis/die angeklickte Datei enthält, ist kein Registrierungswert NoWorkingDirectoryvorhanden
    oder
  2. das Verzeichnis C:\Windows\System32bzw. genauer gesagt %SystemRoot%\system32mit dem in der Windows-Registrierung vorhandenen Registrierungswert NoWorkingDirectory.

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.exeeines Batch-Skripts, dem der angeklickte Verzeichnis-/Dateiname als Argument übergeben wird und das Verzeichnis/die Datei über seinen/ihrenUNC-Pfad.

Die zweite Variante mit NoWorkingDirectoryVorhandensein 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.exedie 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 CreateProcessist 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, CreateProcessdas 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 CreateProcessaufgerufen .CreateProcesslpCurrentDirectory

DerWindows-Datei-Explorer( explorer.exe) ruft CreateProcessmit 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.exeAufrufen CreateProcessin Bezug auf den Funktionsparameter lpCurrentDirectory. Das aktuelle Verzeichnis ist bei Vorhandensein dieses Registrierungszeichenfolgenwerts immer das Systemverzeichnis von Windows, also das Verzeichnis, %SystemRoot%\System32das 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 regBefehlszeilen 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 mdund die vier echoBefehlszeilen erstellen die Batchdatei C:\Temp\DirTest\DirTest.cmdmit 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 etcund 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 CreateProcesson gesetzt wurde, beginnend cmd.exemit den vier Argumenten gemäß der Zeichenfolge, die lpCurrentDirectoryvom übergeordneten Prozess mit übergeben wurde explorer.exe. Es ist ersichtlich, dass dieWindows-Datei-ExplorerCreateProcesswird in diesem Fall mit C:\Windows\System32\driversdem 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.exees explorer.exebzw. gestartet wurde CreateProcess, cmd.exeobwohl es in der Registry ohne Umgebung gespeichert ist, wird es in „Beginnen mit“ "eingeschlossen ."explorer.exe

Der Registry-String-Wert NoWorkingDirectoryexistiert momentan nicht. Aus diesem Grund cmd.exewird das aktuelle Arbeitsverzeichnis für auf gesetzt , das beim Rechtsklick C:\Windows\System32\driversdas aktuelle Verzeichnis von ist.explorer.exeauf der rechten Seiteauf dem Ordner etcmit 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:\Windowswährend der aktuell aktive Ordner noch aktiv ist, C:\Windows\System32\driversund 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\driversnoch 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\System32und nicht C:\WINDOWS\system32. Bitte beachten Sie die Unterschiede bei einigen Buchstaben. Der hier tatsächlich verwendete Windows-Systemverzeichnispfad ist eine Verkettung des Registrierungswerts SystemRootunter dem Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion, der den Zeichenfolgenwert C:\WINDOWSmit 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 CreateProcessdefiniert, welches Verzeichnis das aktuelle Verzeichnis für den erstellten Prozess ist.

cmd.exehat 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.exeGrü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.exeauch 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 NoWorkingDirectoryohne 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:\Windowsmit dem aktuell aktiven Ordner noch C:\Windows\System32\driversmit 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-ExploreretcKlicken Sie im Verzeichnis C:\Windows\System32\driversauf 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"

NoWorkingDirectoryDie erste Zeile zeigt den wichtigen Unterschied mit dem vorhandenen Registrierungsstring-Wert, der jetzt C:\WINDOWS\system32statt C:\Windows\system32\driveswie zuvor lautet. Das aktuelle Arbeitsverzeichnis ist jetzt immer das mit definierte Windows-Systemverzeichnis %SystemRoot%\system32.

Es spielt keine Rolle, ob NoWorkingDirectoryder Registrierung ohne Zeichenfolgenwert oder mit einer Zeichenfolge wie hinzugefügt wird C:\Windows. Es kann sogar ein Registrierungswert vom Typ DWORDmit Namen NoWorkingDirectorymit Wert 0oder hinzugefügt werden 1. Der Registrierungswerttyp NoWorkingDirectoryund 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 NoWorkingDirectoryvorhanden 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\DirTestVerzeichnis 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 .lnkdefinieren die Werte, die vonForscherüber CreateProcessseine Funktionsparameter und die Struktur STARTUPINFO. Beispielsweise die EigenschaftStartet indefiniert den Zeichenfolgenwert, auf den lpCurrentDirectoryschließ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 startunterstützt Optionen, die alle CreateProcessbei cmd.exeihrer Verwendung übergeben werden, wie etwa die Option /D, die die Zeichenfolge definiert, die CreateProcessmit dem Funktionsparameter übergeben wird lpCurrentDirectory.

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 CreateProcessohne oder mit einer STARTUPINFOStruktur 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 pushdBefehl gestartet wird und pushdUNC-Pfade unterstützt. NoWorkingDirectory dient lediglich dazu, die Anzeige einer Warnmeldung zu vermeiden.

Für PowerShell ist es nicht wirklich erforderlich.

verwandte Informationen