Windows 10에서는 Shift 키를 누른 채 폴더를 마우스 오른쪽 버튼으로 클릭하거나 파일 탐색기의 배경을 클릭하면 상황에 맞는 메뉴에 "여기에 PowerShell 창 열기" 명령이 추가됩니다.
'
그러나 PowerShell 창을 여는 데 사용되는 명령은 폴더 이름에 포함된 문자가 포함되지 않는다고 잘못 가정한다는 점에서 잘못 정의되어 있습니다(최소 W10 릴리스 ID 1709 기준).
# !! Breaks with folder names such as "a'b"
powershell.exe -noexit -command Set-Location -literalPath '%V'
수정 사항은 아래를 참조하세요. 단, 관리 권한이 필요하다는 점에 유의하세요.
답변1
업데이트: 독립 실행형 명령 --- 스크립트 파일 종속성이 없습니다.
이 코드를 복사하여 붙여넣고 실행하세요.파워셸즉각적인 "개념 증명" 데모를 위한 콘솔:
$msg = @'
$Args[0] : {0}
$Args[1] : {1}
'@
&{echo ($msg -f $Args[0], $Args[1])} --% I'm an unquoted string with an apostrophe and spaces.
산출:
PS C:\> $msg = @'
>> $Args[0] : {0}
>> $Args[1] : {1}
>> '@
>> &{echo ($msg -f $Args[0], $Args[1])} --% I'm an unqoted string with an apostroohe and spaces.
$Args[0] : --%
$Args[1] : I'm an unqoted string with an apostroohe and spaces.
PS C:\>
--%
( 기능적이며 인수로 포착되는 흥미로운 점 )
'마법의 총알'은토큰 구문 분석 중지: --%
. 문서에 따르면:
PowerShell 3.0에 도입된 구문 분석 중지 기호(--%)는 PowerShell이 입력을 PowerShell 명령이나 식으로 해석하지 않도록 지시합니다.
...
구문 분석 중지 기호가 나타나면 PowerShell은 줄의 나머지 문자를 리터럴로 처리합니다.
실행 파일에 대한 인수와 함께 사용하기 위한 것이지만 위 코드에서 볼 수 있듯이 스크립트 블록에 대한 인수와도 작동합니다.
Set-Location
따라서 따옴표가 없는 경로로 실행하려면 구문은 다음과 같습니다.
&{Set-Location -LiteralPath $Args[1]} --% <unquoted path>
따라서 레지스트리 명령은 다음과 같습니다.
powershell.exe -NoExit -Command &{Set-Location -LiteralPath $Args[1]} --%% %V
- 결과 명령에서
%%
리터럴 기호를 생성하려면 이중 백분율 기호( )가 필요합니다.%
컴퓨터 전체에서 명령을 수정하려면 레지스트리를 직접 편집하세요. 관련 키는 다음과 같습니다.
HKLM\SOFTWARE\Classes\Directory\Background\Shell\PowerShell\Command
HKLM\SOFTWARE\Classes\Directory\Shell\PowerShell\Command
값 을 편집하여
(Default)
다음과 같이 변경합니다.powershell.exe -NoExit -Command &{Set-Location -LiteralPath $Args[1]} --%% %V
Full Control
사용자에게 추가한 권한을 제거합니다 .소유권을 얻기 위해 수행한 단계에서 사용자 이름을
TrustedInstaller
지정하여 소유자를 다시 변경하세요 .NT Service\TrustedInstaller
사용자별로 명령을 수정하려면 레지스트리 키를 만들고 편집하면 됩니다.
HKCU\Softwar\Classes\Directory\Background\Shell\PowerShell\Command
HKCU\Software\Classes\Directory\Shell\PowerShell\Command
값을(Default)
다음으로 변경:powershell.exe -NoExit -Command &{Set-Location -LiteralPath $Args[1]} --%% %V
또는 다음을 복사하고, 일시 중지하고, 실행하세요.
'Background\','' | ForEach{
$splat = @{
'Path' = ('HKCU:\Software\Classes\Directory\{0}Shell\PowerShell\Command' -f $_)
'Value' = 'powershell.exe -NoExit -Command &{Set-Location -LiteralPath $Args[1]} --%% %V'
}
New-Item @splat -Force
}
원래 답장
5.1 해결 방법의 경우 단지파워셸하지만 한 줄 스크립트를 호출하면 효과가 있는 것 같습니다.
(@mklement0의 의견에 따른 코드 편집/개선)
### OpenHere.ps1
Set-Location -LiteralPath $Args[0]
### (HKCU|HKLM)\Software\Classes\Direcory[\Background]\Shell\PowerShell\Command
###
###powershell.exe -noexit -File "C:\Path\to\OpenHere.ps1" "%V"
###
- 적절한 위치에 "OpenHere.ps1"로 저장합니다.
- 그런 다음 다음 중 하나를 수정할 수 있습니다.
HKLM\SOFTWARE\Classes\Directory\Shell\PowerShell\Command
관리자 액세스 권한이 있고 소유권 및 권한을 다루는 데 능숙한 경우.
그렇지 않으면 다음에서 사용자별 항목을 생성할 수 있습니다.HKCU\Software\Classes\Directory\Shell\PowerShell\Command
레지스트리 명령줄의 구문은 다음과 같습니다.
powershell.exe -noexit -File "C:\Path\to\OpenHere.ps1" "%V"
HKCU
다음은 (사용자별 모드) 아래에 컨텍스트 메뉴 항목을 생성하는 위 코드의 "자동 설치" 버전입니다 .
- 다음을
.ps1
상주할 디렉터리에 파일로 저장합니다. - 다음에서 스크립트를 실행하세요.파워셸인수가 없는 콘솔입니다. 코드는
.ps1
생성된 명령줄에서 파일의 현재 Path\FileName을 사용합니다.
### OpenHere.ps1
If ($Args) { ### Launched from context menu
Set-Location -LiteralPath $Args[0]
} Else { ### Create HKCU registry entries
'Background\','' | ForEach {
$splat = @{
'Path' = ('HKCU:\Software\Classes\Directory\{0}Shell\PowerShell\Command' -f $_)
'Value' = ('powershell.exe -NoExit -File "{0}" "%V"' -f $PSCommandPath)
'Type' = 'ExpandString'
}
New-Item @splat -Force
}
}
### The "(Default)" value is created as a REG_EXPAND_SZ to allow for subsequent
### editing that can include environmental variables
답변2
머리말
Keith Miller의 유용한 답변실용적이고 자동화된 솔루션입니다. 주목해야 할 유일한 점은 이 솔루션이사용자 수준.
아래 답변은 관심을 가질 수 있습니다.모든 사용자들솔루션 및 기술적 배경 Keith의 답변 은
OpenHere.ps1
모든 사용자 솔루션에서 동일하게 사용될 수 있습니다(자체 설치 부분 제외).
모자 끝 부분에레스페르치그의 모든 입력에 대해.
메모:
- 이번 수정관리 권한이 필요합니다(달리기고도가 있는).
열고regedit.exe
다음 단계를 적용하십시오.둘 다다음 레지스트리 키 중: HKEY_CLASSES_ROOT\Directory\shell\Powershell\command
그리고
HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell\command
:
준비:권한 수정값 수정(PowerShell 명령)이 가능해집니다.
수동 권한 수정의 대안:
@LesFerch는 다음과 같은 타사 유틸리티를 언급합니다.대안
regedit.exe
사용자 로 직접 실행할 수 있도록 허용하여 수동 권한 수정NT SERVICE\TrustedInstaller
:파워런(내가 선호하는),고급실행. 이는 권한을 조작하는 것(사람들이 종종 잘못하여 문제를 일으키는 경우)보다 훨씬 안전한 옵션입니다.
Keith Miller의 유용한 답변정의한다고 언급함사용자 수준대안으로 키 - 권한 상승이 필요하지 않지만 솔루션이 다음으로 제한됩니다.현재 사용자.
하위 키를 마우스 오른쪽 버튼으로 클릭
command
하고 선택하십시오.Permissions...
다음을 클릭
Advanced
하고:- 그룹
Administrators
을소유자열쇠의 Administrators
그룹에 키에 대한 모든 권한을 부여합니다.
- 그룹
참고: 저는 이러한 수정으로 인한 부작용에 대해 알지 못하지만, 알고 계시다면 알려주십시오.
그러나 안전을 위해 아래 설명된 대로 명령을 수정한 후 이러한 수정 사항을 되돌릴 수 있습니다. 이 경우TrustedInstaller
보안 주체를 키 소유자로 복원해야 합니다command
. 으로 지정해야 합니다
NT SERVICE\TrustedInstaller
.
이제
command
키(Default)
값을 다음으로 바꿉니다(아래 콘솔 설정/색상 참고 사항 참조).cmd /c set "_dir=%V%" & powershell.exe -NoExit -Command Set-Location -LiteralPath $env:_dir
메모:
via 를 호출하면
cmd
Windows PowerShell 대신 파란색 배경이 포함된 Windows PowerShell의 콘솔 설정을 얻을 수 있습니다.start
앞에 를 배치하여 이를 방지할 수 있습니다powershell.exe
.새창일반적인 설정과 색상을 사용하지만 단점은 항상 생성되는 원래의 임시 창이cmd.exe
화면에서 잠시 깜박인다는 것입니다.키스 밀러의 답변를 통해 대안을 제시합니다.도우미
.ps1
스크립트을 통해 직접 호출을 허용하므로powershell.exe -File
깜박이는 문제를 방지합니다. 그만큼-File
CLI매개변수는 해당 인수를 처리합니다.문자 그대로이므로 사용시 아래에 설명된 문제는-Command
적용되지 않습니다.powershell.exe -NoExit -File "C:\Path\to\OpenHere.ps1" "%V"
부름~을 통해
cmd /c
은가장 견고한그리고안전한옵션:의 값은 문자 가 포함된 경우
%V
에만 구문적으로 명령을 중단할 수 있으며 이는 정의상 불가능합니다(파일 및 폴더 이름에는 를 포함할 수 없음 ).set
"
"
그러나 폴더 이름에
cmd.exe
환경 변수 참조 처럼 보이는 내용이 포함된 경우말 그대로(예%OS%
: )그리고참조된 변수가 존재하면 참조가 확장되어 해당 폴더로의 변경이 실패하거나 가상적으로 다른 폴더가 대상으로 지정됩니다.cd
명령을 호출 의 일부로 만 사용할 수 없는 이유는 이름에 or (예 : ) 가 포함된 폴더에서 호출하면 오작동하기cmd.exe
때문입니다 . 이 버그는 다음에서 수정되었습니다.powershell.exe
[
]
foo[0]
파워셸(코어) 7+CLI,pwsh.exe
따라서 다음을 간단히 사용할 수 있습니다.# PowerShell 7+ cmd /c cd /d "%V" & pwsh.exe
사실은
pwsh.exe
새로운-WorkingDirectory
매개변수를 활성화합니다.직접호출(이것은 더 효율적일 뿐만 아니라 콘솔 설정 문제도 방지합니다): [1]pwsh.exe -WorkingDirectory "%V\."
powershell.exe
직접 전화하면서~이다옵션은 항상 포함됩니다.트레이드오프:폴더 이름에 리터럴
'
문자가 포함될 수 있지만 리터럴`
이나$
문자는 절대 포함되지 않는 경우 다음을 사용할 수 있습니다"..."
(확장 가능(보간) 문자열) 대신 다음과 같이 제공됩니다. 경고:명령은 단순히부조
foo`bar
또는$foo
(또는 - 가상적으로 -) 과 같은 축어적 폴더 이름을 사용하여다른디렉토리), 이로 인해 다음이 발생할 수 있습니다.원치 않는 명령 실행, 하위 표현식이 포함된 신중하게 악의적으로 제작된 폴더 이름을 통해$(...)
.powershell.exe -NoExit -Command "Set-Location -LiteralPath \"%V\""
위의 단계를 스크립트로 작성할 수 있어야 합니다.
[1]은 \.
다음을 보장하기 위해 첨부되었습니다.뿌리같은 경로 C:\
도 적절하게 처리됩니다. 그렇지 않으면 PowerShell CLI는 "C:\"
예를 들어 C:
다음과 같이 를 (정당하게) 해석합니다.탈출하다 "
문자, 즉 사실상말 그대로 C:"
, 어느휴식.