什么时候需要在 Powershell 中用双引号将字符串括起来?我需要以下所有这些吗?
& "$sendemail" -f "$sender" -t "$recipient" -u "$subject" -o message-file="$logpath" -s "$emailserver" -o tls=no
什么时候需要在 Powershell 中用双引号将字符串括起来?我需要以下所有这些吗?
& "$sendemail" -f "$sender" -t "$recipient" -u "$subject" -o message-file="$logpath" -s "$emailserver" -o tls=no
有一个解释如何在 PoSH 中使用撇号和引号。在您的示例中,您不需要它们,因为您不扩展变量或执行连接。
在这种情况下,你不需要。
$sendemail
希望已经是一个字符串,因此调用运算符&
可以处理它(也许其他任何东西都会被强制转换为字符串)。所有其他变量也应正确引用:
PS> $subject = 'subject string'
PS> $recipient = 'recipient string'
PS> $logpath = 'log path'
PS> $emailserver = 'email server'
PS> $recipient = 'recipient''s name'
PS> $sender = 'sender''s name'
PS> $sendemail = './echoargs.exe'
PS> & $sendemail -f $sender -t $recipient -u $subject -o message-file=$logpath -s $emailserver -o tls=no
arg 1: -f
arg 2: sender's name
arg 3: -t
arg 4: recipient's name
arg 5: -u
arg 6: subject string
arg 7: -o
arg 8: message-file=log path
arg 9: -s
arg 10: email server
arg 11: -o
arg 12: tls=no
如果要将包含特殊字符(例如 shell 运算符或空格)的文字字符串传递给程序,则需要引号,例如:
./echoargs 'some spaces and a | pipe'
如果您的所有参数要么不包含此类内容,要么本身已经包含在字符串变量中,那么没有引号就可以了。
到目前为止,所有答案都只是完整问题“您何时需要在 PowerShell 中使用引号(以及何时需要,您使用哪种引号)?”的部分答案。尽管人们自然会认为 MSDN 页面about_quoting_rules会有完整的答案,但事实并非如此。它主要涵盖字符串插值和此处的字符串,但不涉及是否或是否真的需要引号。
PowerShell 中的答案可能比其他语言复杂一些,因为 PowerShell 提供了既是脚本语言又是 shell 语言的灵活性。PowerShell 旨在最大限度地减少 shell 的键入工作,正如人们在 shell 语言中所期望的那样,但同时,它可以与 PowerShell 脚本完全互操作。
我实际上开始在这里写一个详细的答案,但它越来越大,直到它变成一篇文章长度的故事加上一个弹出式挂图(如下所示的片段),所有这些都发布在 Simple-Talk.com 上。请参阅何时在 PowerShell 中引用。