이름에 앰퍼샌드가 포함된 항목에 대해 탐색기 상황에 맞는 메뉴를 통해 PowerShell 스크립트 실행

이름에 앰퍼샌드가 포함된 항목에 대해 탐색기 상황에 맞는 메뉴를 통해 PowerShell 스크립트 실행

나는 제공된 기술의 약간 수정된 버전을 사용하고 있습니다.이 답변Windows의 파일 탐색기에서 특정 폴더에 대해 PowerShell 스크립트를 실행할 수 있는 상황에 맞는 메뉴 항목을 생성합니다.

명령은 다음과 같습니다:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 

폴더 이름에 앰퍼샌드(&)가 있는 경우를 제외하고는 정상적으로 작동합니다. 그런 다음 다음 오류가 발생합니다(대상 폴더 이름은 Testing & Testing).

The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1  <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing  <<<<
    + CategoryInfo          : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

분명히 뭔가가 앰퍼샌드를 특수 문자로 해석하고 있지만 이 문제를 해결하는 방법을 잃어버렸습니다. 폴더 이름에서 앰퍼샌드를 제거하는 것은 나에게 실행 가능한 해결책이 아닙니다.

배치 스크립트를 포함하지 않는 솔루션이 선호됩니다.

PowerShell 2와 함께 Windows 7 Enterprise(64비트)를 사용하고 있습니다.

답변1

당신은 사용할 수 있습니다말 그대로 마커Powershell : --%, 이는 Powershell에 그 뒤에 오는 모든 내용이 해석되어서는 안 된다는 것을 알려줍니다.

이렇게 하면 명령은 다음과 같습니다.

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

파일 이름에 큰따옴표가 없으면 괜찮습니다.

이 마커는 Powershell 3.0의 새로운 기능이므로 최신 상태인지 확인하세요.

답변2

PowerShell 스크립트를 수정해 볼 수 있습니다. 그리고 cmd 줄을 배치 파일로 변경하십시오 ...

배치(runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"

두 번째 줄은 전체 경로 없이 PowerShell 스크립트를 실행할 수 있도록 runer.cmd 파일이 있는 폴더를 현재 폴더로 설정한다는 의미입니다. runner.cmd 파일을 편집할 필요가 없으므로 항목을 더 쉽게 이동할 수 있습니다.

그리고 스크립트에서 다음을 통해 경로에 액세스합니다.

$value = $env:ps_arg -replace """",""

배치 파일의 따옴표는 PowerShell 스크립트로 전달된 것으로 보이며 제거해야 하므로 -replace """","". Windows 파일 이름에 큰따옴표는 불법이므로 중요한 내용은 절대 제거되지 않습니다.

따라서 명령줄은 다음과 같습니다.

cmd /K runner.cmd "%1"

답변3

인용 문제입니다. 명령이 다음과 같이 표시되도록 이스케이프된 큰따옴표를 이스케이프된 작은따옴표로 바꿉니다.

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"

두 가지 다른 프로그램(cmd 및 powershell)을 사용하고 있으며 인수(cmd, powershell 및 .ps1 스크립트)를 사용할 수 있는 세 가지 다른 코드 조각을 실행하고 있습니다.

cmd에는 /K Powershell과 powershell에 대한 인수라는 세 가지 인수가 필요합니다. powershell의 인수는 하나의 문자열이어야 하므로 따옴표 안에 표시됩니다.

Powershell에는 실행하려는 명령줄이라는 하나의 인수가 필요합니다.

.ps1 스크립트에는 실행할 폴더라는 인수가 필요합니다. Powershell은 경로를 단일 문자열로 해석해야 하므로 따옴표로 묶어야 합니다.

명령을 실행하면 cmd는 Powershell을 시작하고 따옴표나 이스케이프 문자 없이 변수가 확장된 따옴표 붙은 문자열을 보냅니다.C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip

따옴표는 스크립트가 세 개가 아닌 하나의 인수를 보도록 보장합니다.

(왜 다른 유형의 인용문이 다른 결과를 내는지 잘 모르겠지만(내가 아는 한 그런 결과가 나와서는 안 됩니다) 테스트할 때 그랬기 때문에 내 시스템에서 작동하는 솔루션을 제공했습니다. 더 많은 정보를 제공할 수 있다면 자세한 내용을 알고 나면 귀하에게도 적합한 솔루션을 찾을 수 있을 것입니다.)

관련 정보