4

在 PowerShell (PS) 中,按照官方语法中定义的顺序使用 cmdlet 参数是否重要?

我正在将-cc参数添加到现有脚本中的 send-mailMessage 中。我-cc之后立即添加-To,它工作得很好,所以我倾向于独自离开。但是 cmdlet 的唯一参数集在帮助文本中定义如下:

Send-MailMessage [-To] <String[]> [-Subject] <String> [[-Body] <String> ] [[-SmtpServer] <String> ] -From <String> [-Attachments <String[]> ] [-Bcc <String[]> ] [-BodyAsHtml] [-Cc <String[]> ] [-Credential <PSCredential> ] [-DeliveryNotificationOption <DeliveryNotificationOptions> ] [-Encoding <Encoding> ] [-Port <Int32> ] [-Priority <MailPriority> ] [-UseSsl] [ <CommonParameters>]

所以我认为最佳实践是运行这样的命令(在主题、正文、smtpserver 和 from 之后,按照帮助文本运行):

send-mailmessage -to $mailTo -subject $mailSubj -body $msgbody -smtpserver smtp.domain.tld -from $mailFrom -cc $mailCC

...而不是像这样(在许多其他参数之前 cc):

send-mailmessage -to $mailTo -cc $mailCC -subject $mailSubj -body $msgbody -smtpserver smtp.domain.tld -from $mailFrom

总的来说,我对此并没有特别小心,而且东西很有效。因此,按照这些思路返回并调整现有的功能脚本肯定是矫枉过正(更不用说容易出错了)。但也许值得在未来的脚本中尊重参数顺序?还是不值得麻烦?你说什么?

当然,您不想对哪个参数是默认参数做出错误的假设,然后省略参数名称;我也可以想象这种事情会因自定义函数等而变得混乱。但我的问题是关于更简单的情况,即显式命名内置 cmdlet 的参数时,如上面的send-mailMessage示例所示。

4

1 回答 1

6

如果您在调用 cmdlet 时命名参数(例如Get-ChildItem -Path *.txt),那么指定它们的顺序无关紧要。所有内容都完全由名称指定,因此解析参数时不需要提供参数的顺序。

如果你没有命名你的参数(例如Get-ChildItem *.txt),那么它确实很重要。cmdlet 作者可以指定某些参数可以/应该按特定顺序在没有名称的情况下被预期。Powershell 引擎将尽最大努力实现这一点,并且通常它会尝试将未命名的参数与尚未分配的任何参数配对。

查看有关参数类型的此页面以获取更多技术信息。

于 2012-10-26T18:35:57.600 回答