我是Linux的长期用户,但我是Windows和PowerShell的新手。我刚刚第一次安装了Windows7和Strawberry Perl 5。我现在想用Windows PowerShell进行简单的命令行打印。
看起来Perl安装正确:
PS C:\Users\Me> perl -v This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright 1987-2007, Larry Wall ...
命令行的工作原理:
PS C:\Users\Me> perl -e 'die' Died at -e line 1. PS C:\Users\Me> echo 'print "Hello, World\n"' | perl Hello, World
但是当我单独尝试它时会打印出一个文件处理程序警告:
PS C:\Users\Me> perl -e 'print "Hello, World\n"' No comma allowed after filehandle at -e line 1.
所以看起来它删除了双引号。
PS C:\Users\Me> perl -e 'print \"Hello, World\n\"' Hello, World
虽然有效但丑陋!让我们再试一次:
PS C:\Users\Me> perl -e 'print qq{Hello, World\n}' Hello, World
多喜欢它,但我很困惑。
为什么PowerShell会在单引号中转义双引号? 有没有PowerShell用户?
答案 0 :(得分:3)
我认为这里有一些问题。一个是引号在powershell和perl中都具有象征意义。 PowerShell中的引用和转义工作与UNIX shell中的工作略有不同。在powershell中查看man about_quoting。
第二个问题是perl命令行在Windows期间表现不同。你想要传递给perl的命令行中的任何双引号需要以perl术语转义为\“。这不是PowerShell特有的。这是perl在Windows上运行的方式。你通常会遇到类似的问题cmd.exe的。
这些版本应该有效:
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
使用单引号减少转义可以做同样的事情。
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
您也可以将换行符放在powershell中,而不是将换行符转义序列传递给perl进行解析。
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
答案 1 :(得分:1)
有趣。好像当你离开powershell世界时,它会将单引号转换为双引号,以便由windows命令shell正确解释。 (或类似的东西)。用python演示(似乎表现出相同的问题):
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
如果我尝试从windows命令shell执行类似的操作,则会得到同样的错误:
C:\>python -c "print "Hi from python""
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined
就好像powershell在执行命令时这样做:
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
答案 2 :(得分:0)
如果在cmd.exe而不是PowerShell中运行“wrong”命令会发生什么?我问,因为有效的转义序列(\"
)是Perl的;在PowerShell中,它将是````。