
사용자 정의 오른쪽 클릭 메뉴 항목이 생성될 때 Windows 레지스트리에서 빈 "NoWorkingDirectory" 문자열 값이 자주 사용됩니다. 예를 들어 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 사용자를 위한 짧은 답변
디렉터리나 파일을 마우스 오른쪽 버튼으로 클릭하여 열리는 쉘 컨텍스트 메뉴 항목을 통해 실행 파일에 인수로 전달된 하나 이상의 디렉터리/파일 이름을 사용하여 실행 파일을 실행합니다.Windows 파일 탐색기창) 결과적으로 이 실행 파일에 대해 설정된 현재 작업 디렉터리로 실행 파일이 시작됩니다.
NoWorkingDirectory
레지스트리 값이 없을 때 클릭한 디렉터리/파일이 포함된 디렉터리
또는- 디렉터리
C:\Windows\System32
또는 더 정확하게는 Windows 레지스트리에 있는%SystemRoot%\system32
레지스트리 값을 사용합니다 .NoWorkingDirectory
좋지 않은 코딩된 실행 파일과 스크립트 중 상당수는 현재 작업 디렉터리가 처리할 디렉터리나 파일이 포함된 디렉터리로 설정된 첫 번째 변형이 필요합니다. 이것이 첫 번째 변형이 기본값인 이유입니다.
경우에 따라 첫 번째 변형은 cmd.exe
클릭한 디렉터리/파일 이름을 인수로 전달하고 해당 디렉터리/파일을 사용하여 참조하는 배치 스크립트를 처리하기 위해 실행하는 것과 같은 원치 않는 동작을 유발합니다.UNC 경로.
NoWorkingDirectory
Windows 레지스트리에 있는 두 번째 변종은 정말 훌륭하게 코딩된 모든 실행 파일과 스크립트에 사용할 수 있습니다.
세부 사항에 관심이 있는 Windows 사용자 및 프로그래머를 위한 긴 답변
Windows 커널 라이브러리에는 다음 함수가 포함되어 있습니다.프로세스 생성explorer.exe
이는 다른 실행 파일을 실행하거나 실행할 수 있는 대부분의 다른 실행 파일 에서 사용됩니다.시작 정보Windows 실행 파일을 시작하는 구조입니다. 함수의 매개변수 중 하나 는 생성할 프로세스의 현재 작업 디렉터리로 설정할 디렉터리 경로가 포함된 문자열에 대한 긴 포인터 CreateProcess
입니다 . 생성할 프로세스의 현재 작업 디렉터리로 호출하는 프로세스의 현재 디렉터리를 사용하도록 lpCurrentDirectory
지시하기 위해 포인터 값이 null일 수도 있습니다 . 대부분의 실행 파일은 함수 매개변수에 대해 널 포인터를 사용하여 호출합니다 .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"
두 개의 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
과 네 개의 명령줄은 다음 명령줄을 사용하여 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"
첫 번째 출력 라인은 상위 프로세스가 전달한 문자열에 따라 네 개의 인수로 CreateProcess
시작하여 설정된 현재 디렉터리를 보여줍니다 . 다음과 같은 것을 알 수 있다.cmd.exe
lpCurrentDirectory
explorer.exe
Windows 파일 탐색기CreateProcess
이 경우에는 C:\Windows\System32\drivers
현재 작업 디렉터리 경로 로 호출됩니다 .
두 번째 출력 줄에는 Windows 레지스트리에 추가된 배치 파일을 참조하는 데 사용되는 문자열인 인수 0을 포함하여 배치 파일이 시작된 인수가 표시됩니다.
세 번째 줄은 각각 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
해당 항목의 상황에 맞는 메뉴를 마우스 왼쪽 버튼으로 클릭합니다.작업 디렉토리 테스트 없음.
다음 줄을 표시하는 콘솔 창이 하나 더 열립니다.
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"
두 번째와 세 번째 줄은 예상대로입니다. 그러나 현재 디렉토리는 nor C:\Windows\System32\drivers
도 아니고 C:\
not 도 아닙니다 C:\Windows
. 따라서 사용자가 디렉터리 또는 가상 셸 폴더의 왼쪽에 있는 폴더 트리에서 마우스 오른쪽 버튼을 클릭할 때 디렉터리가 포함된 디렉터리로 실행 파일을 시작하는 것이 항상 예상대로 작동하지 않는다는 것을 알 수 있습니다.
또한 현재 작업 디렉토리 경로는 Windows 시스템 디렉토리의 실제 디렉토리 경로가 아닌 것을 볼 수 있습니다. 이 경우에는 표시되지 C:\Windows\System32
않습니다 C:\WINDOWS\system32
. 일부 문자의 경우 차이점을 참고하시기 바랍니다. 여기서 실제로 사용되는 Windows 시스템 디렉터리 경로는 문자열 값이 고정 문자열과 연결된 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(Universal Naming Convention) 검사를 비활성화하고 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\""
위에 게시된 레지스트리 출력에서 추가 세 번째 줄이 누락되었습니다.
~ 안에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
. 값 또는 DWORD
이름이 있는 유형의 레지스트리 값을 추가할 수도 있습니다 . Windows 셸( )에서는 레지스트리 값 유형 과 해당 값이 중요하지 않습니다 . 셸 확장에 사용되는 키 아래의 Windows 레지스트리에 이름이라는 레지스트리 값이 있는지 여부만 중요합니다 .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
. - 자바클래스 ProcessBuilderWindows에서는
CreateProcess
. - 파이썬하위 프로세스 모듈Windows에서는
CreateProcess
. - Windows 명령 프로세서 명령은 함수 매개변수를 사용하여 전달된 문자열을 정의하는 옵션과 같이 사용하여 전달
start
되는 옵션을 모두 지원합니다 .CreateProcess
cmd.exe
/D
CreateProcess
lpCurrentDirectory
Windows에서 실행 파일 실행을 지원하는 모든 프로그래밍 및 스크립팅 언어에는 구조 CreateProcess
가 없거나 STARTUPINFO
구조가 있는 Windows에서 호출하는 함수 또는 클래스가 있습니다.
답변3
"NoWorkingDirectory" 동사 속성은 문서화되지 않았으므로 이는 단지 추측일 뿐입니다.
Cmd.exe는 현재 디렉터리로 원격 공유(UNC)를 지원하지 않으며 이러한 작업 디렉터리에서 Cmd.exe를 시작하면 콘솔에 경고 메시지가 인쇄됩니다.
"여기에서 명령 창 열기" 등록을 보면 명령으로 Cmd.exe를 시작 pushd
하고 pushd
UNC 경로를 지원하는 것을 볼 수 있습니다. NoWorkingDirectory는 경고 메시지 표시를 피하기 위해 존재합니다.
PowerShell에는 실제로 필요하지 않습니다.