업데이트: 독립 실행형 명령 --- 스크립트 파일 종속성이 없습니다.

업데이트: 독립 실행형 명령 --- 스크립트 파일 종속성이 없습니다.

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
  1. 키의 소유권을 갖고 자신에게 모든 권한을 할당하세요..

  2. 값 을 편집하여 (Default)다음과 같이 변경합니다.

     powershell.exe -NoExit -Command &{Set-Location -LiteralPath $Args[1]} --%% %V  
    
  3. Full Control사용자에게 추가한 권한을 제거합니다 .

  4. 소유권을 얻기 위해 수행한 단계에서 사용자 이름을 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 를 호출하면 cmdWindows 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:", 어느휴식.

관련 정보