2009-08-08 5 views
6

Jestem długoletnim użytkownikiem Linuksa, ale jestem nowy w Windows i PowerShell. Właśnie zainstalowałem Windows7 i Strawberry Perl 5 po raz pierwszy. Teraz chcę wykonać prosty wydruk z wiersza polecenia za pomocą Windows PowerShell.Dlaczego PowerShell (z Perlem) usuwa podwójne cudzysłowy w prostej instrukcji drukowania?

Wygląda Perl zainstalowane poprawnie:

 
PS C:\Users\Me> perl -v 
This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright 
1987-2007, Larry Wall 
... 

i linia poleceń rzeczy działa:

 
PS C:\Users\Me> perl -e 'die' 
Died at -e line 1. 

PS C:\Users\Me> echo 'print "Hello, World\n"' | perl 
Hello, World 

Ale gdy próbuję to wszystko sam wypisuje filehandler ostrzeżenie:

 
PS C:\Users\Me> perl -e 'print "Hello, World\n"' 
No comma allowed after filehandle at -e line 1. 

Wygląda więc na to, że usuwa podwójne cudzysłowy.

 
PS C:\Users\Me> perl -e 'print \"Hello, World\n\"' 
Hello, World 

To działa, ale jest brzydkie! Spróbuj ponownie:

 
PS C:\Users\Me> perl -e 'print qq{Hello, World\n}' 
Hello, World 

To bardziej podoba, ale jestem zdezorientowany.

Dlaczego program PowerShell wymyka się podwójnym cudzysłowom w ramach pojedynczego cudzysłowu? Dowolni użytkownicy PowerShell?

+1

Czy wypróbowałeś 'perl -e" print 'Hello, World' "'? – Weegee

Odpowiedz

3

Myślę, że jest tu kilka problemów. Po pierwsze, cytaty mają znaczenie symboliczne zarówno w powerhell, jak iw perlu. Cytaty i ucieczka działają nieco inaczej w powłoce powershell niż w powłoce systemu UNIX. Sprawdź man about_quoting in powershell.

Drugą kwestią jest to, że linia poleceń perl zachowuje się inaczej w systemie Windows. Jakikolwiek podwójny cudzysłów w wierszu poleceń, który chcesz przekazać perlowi, musi zostać zmieniony w \ "perl \" jako \ ".Nie jest to specyficzne dla powershell, tak działa perl w systemie Windows. . cmd.exe

wersje te powinny działać:

PS> & perl -e "print \`"hello, world\n\`"" 
hello, world 
PS> $s = "print \`"hello, world\n\`"" 
PS> echo $s 
print \"hello, world\n\" 
PS> & perl -e $s 
hello, world 

można zrobić to samo z mniej ucieczce za pomocą pojedynczego cudzysłowu.

PS> & perl -e 'print \"hello, world\n\"' 
hello, world 
PS> $s = 'print \"hello, world\n\"' 
PS> echo $s 
print \"hello, world\n\" 
PS> & perl -e $s 
hello, world 

Można również wstawić znak nowej linii w powłoce uprawnień zamiast przekazywać sekwencję specjalną nowej linii do perla w celu analizowania.

PS> & perl -e "print \`"hello, world`n\`"" 
hello, world 
PS> $s = "print \`"hello, world`n\`"" 
PS> echo $s 
print \"hello, world 
\" 
PS> & perl -e $s 
hello, world 
0

Co stanie się, jeśli uruchomisz polecenie "wrong" w cmd.exe zamiast PowerShell? Pytam, ponieważ sekwencją ucieczki, która działa (\") jest Perl; w PowerShell będzie to "` ``.

1

Ciekawe, wydaje się, jakby po wyjściu ze świata powłoki, konwertuje pojedynczy cudzysłów na podwójny cudzysłów, aby był prawidłowo interpretowany przez powłokę poleceń systemu Windows. (Lub coś w stylu . że) w celu wykazania, z pytona (co wydaje się wykazywać ten sam problem):

PS C:\> python -c 'print "Hi from python"' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 

który jest ten sam błąd pojawia się, gdy próbowałem zrobić coś podobnego z powłoki poleceń systemu Windows:

C:\>python -c "print "Hi from python"" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 

To tak, jakby robił to powershell podczas wykonywania współpracy mmand:

PS C:\> $s = 'python -c "print "Hi from python""' 
PS C:\> cmd /c $s 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
NameError: name 'Hi' is not defined 
Powiązane problemy