2009-02-09 1 views
20

, 나는 변수를 통해에 전달하는 문자열을 찾고, 파일 걸쳐 선택 문자열을 실행하는거야 ($ 아이디) :PowerShell 문자열 변수에 저장된 이스케이프 시퀀스를 무시하는 방법? 내 PowerShell 스크립트에서

foreach ($file in (ls "path\to\files")) { 
    $found = $false 
    $found = Select-String -Path $file $id -Quiet 
    if ($found) { 
     break 
    } 
} 

불행하게도, $ id 변수가 가끔 일 Select-String이 이스케이프 시퀀스로 해석하려고하는 "\ C"또는 "\ T"와 같습니다. 이것은 유효한 이스케이프 시퀀스가 ​​아니므로 Select-String은 오류를 발생시킵니다. 그것들은 이스케이프 시퀀스 (예 : "C : \ Test"와 같은 파일 경로의 일부일 수 있음)가 아니기 때문에 PowerShell/Select-String이 그러한 문자를 해석하지 못하게하려면 어떻게해야합니까? 내가 행운과 함께 $ id 주위에 괄호를 사용하여 시도했다.

+0

도움이되지 않은 코멘트를 삭제 한 사람에게 감사 :-) – alastairs

답변

32

를 사용하여 정적 escape() 방법, 그것은 정규 표현식 이러한 문자를 해석하는 엔진 그대로가 아니라 같은 메타 지시 :

$id = [regex]::escape($id) 

당신은 또한 하나의 라이너에 명령을 켤 수 있습니다 (-path는의를들을 수 있습니다 파일) :

가 나는 안전하게 다시 "\의 t"에 그것을 탈출하는 방법에 지어진 잘 모르는 것 같아요 당신에 전달 있어요 때 $ ID 문자열이 이미 TAB과 같이 포함되어있는 경우
Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet 
+0

감사합니다. – alastairs

+0

두 번 투표 할 수 있다면 한 줄에 +1을 더줍니다. :-) – Tomalak

+0

슬프게도 한 줄짜리 라이너가 특정 상황에서 작동하지 않습니다. -Filter 및 -Rururse 매개 변수를 자릅니다. – alastairs

0

. 스크립트가 올바른 문자열로 전달되는지 확인해야합니다. 나는. 0x5C74 (\ t)가 아닌 0x09 (TAB)를 전달해야합니다. 따라서 이스케이프 처리는 검색 문자열이 처음 정의 될 때 수행되어야합니다.

Regex.Escape는 TAB을 탈출합니다

-> \ t뿐만 아니라 정규 표현식에서 의미가 이러한 문자를 이스케이프합니다

\, *, +, |, {, [, (,)? , ^, $,., # 및 공백

예 :  . -> \.

관련 문제