배치 파일에서 따옴표를 어떻게 보호합니까?
-
02-07-2019 - |
문제
나는 랩을하고 싶다 Perl One-Liner 배치 파일로. (사소한) 예제, 유닉스 쉘에서 다음과 같은 명령을 인용 할 수 있습니다.
perl -e 'print localtime() . "\n"'
그러나 DOS는이 유용한 오류 메시지로 다음을 질식시킵니다.
-E 라인 1에서 EOF 이전의 String Terminator " ''를 찾을 수 없습니다.
이 작업을 수행하는 가장 좋은 방법은 무엇입니까? .BAT 파일?
해결책
Windows의 Perl 물건의 경우 가능한 한 일반 인용문을 사용하려고 노력하여 이쑤시개 증후군을 기대하지 않습니다. DOS가 필요로하는 물건에 대한 인용문을 저장합니다.
perl -e "print scalar localtime() . qq(\n)"
인쇄물 끝에 Newline이 필요한 경우 -l
스위치는 당신을 위해 그것을합니다 :
perl -le "print scalar localtime()"
스위치로 할 수있는 다른 멋진 일에 대해서는 Perlrun 선적 서류 비치.
다른 팁
Windows의 "DOS Prompt"(cmd.exe)에서는 단일 따옴표가 아닌 이중 따옴표를 사용해야합니다. 인용 된 Perl 코드 내부의 경우 Perl은 많은 옵션을 제공합니다. 셋은 다음과 같습니다.
perl -e "print localtime() . qq(\n)"
perl -e "print localtime() . $/"
perl -le "print ''.localtime()"
Perl 5.10 또는 새로 사용되는 경우 :
perl -E "say scalar localtime()"
감사합니다 JF 세바스찬댓글.
Windows NT+의 일반 배치 파일의 경우 ^ 문자는 많은 것들 (<> | &)을 피하지만 따옴표의 경우 두 배가됩니다.
C:\>perl -e "print localtime() . ""\n"""
Thu Oct 2 09:17:32 2008
첫째, DOS 쉘은 UNIQ처럼 명령 줄을 구문 분석하지 않기 때문에이에 대한 답변은 명령에 따라 다릅니다. 비교되지 않은 전체 문자열을 명령에 전달하여 분할을 수행합니다. 즉, /서브 시스템을 사용하는 경우 : 콘솔을 사용하는 경우 C 런타임은 main ()을 호출하기 전에 분할을 제공하며 대부분의 명령은 이것을 사용합니다.
응용 프로그램 이이 분할을 사용하는 경우 리터럴 이중 쿼트를 입력하는 방식은 두 배가됩니다. 그래서 당신은 할 것입니다
perl -e "print localtime() . ""\n"""
DOS에서는 Perl 명령 주변의 ""를 사용합니다. DOS 쉘은 일반 유닉스 쉘과 같은 단일 따옴표를 수행하지 않습니다.
perl -e "print localtime();"