【问题标题】:Cannot run powershell command via command prompt无法通过命令提示符运行 powershell 命令
【发布时间】:2020-11-06 13:52:55
【问题描述】:

我正在尝试使用以下命令检查我的 Windows SMTP 服务器的 RelayForAuth 设置。 Powershell 似乎显示了正确的结果“False”,但是当通过命令提示符运行相同的命令时,它会产生错误:

Powershell 示例:

([ADSI]"IIS://localhost/smtpsvc/1".RelayForAuth -like "*0*")

输出:

False

命令提示符示例:

powershell -command "([ADSI]"IIS://localhost/smtpsvc/1".RelayForAuth -like "*0*")"

输出:

At line:1 char:8
+ ([ADSI]IIS://localhost/smtpsvc/1.RelayForAuth -like *0*)
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'IIS://localhost/smtpsvc/1.RelayForAuth' in expression or 
statement.
At line:1 char:8
+ ([ADSI]IIS://localhost/smtpsvc/1.RelayForAuth -like *0*)
+        ~
Missing closing ')' in expression.
At line:1 char:56
+ ([ADSI]IIS://localhost/smtpsvc/1.RelayForAuth -like *0*)
+                                                        ~
Unexpected token ')' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], 
ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

【问题讨论】:

  • 现在将内部双引号更改为单引号。此外,您可以将工作行放在 powershell 脚本中并使用 powershell script.ps1 运行它。

标签: windows powershell smtp command-prompt adsi


【解决方案1】:

因为您正在 嵌套(嵌入)" 字符。 - 将 逐字 传递给 PowerShell - 在 语法外部双引号("..."),你必须转义那些嵌套的"字符。

尽管 PowerShell-在内部` 用作转义字符,从外部调用 PowerShell CLI (powershell.exe / pwsh) (cmd.exe) 需要\-转义"

# Embedded " chars. must be \-escaped
powershell -command "([ADSI]\"IIS://localhost/smtpsvc/1\").RelayForAuth -like \"*0*\""

请注意,如果您单个引用整个"..." 字符串中的字符串,则可以避免这种转义。 虽然这在您的情况下工作正常,但鉴于您的字符串只有 逐字 内容,请注意,这通常只有在不需要 string interpolation 时才可以选择

# Embedded strings use '...' -> no escaping needed.
powershell -command "([ADSI]'IIS://localhost/smtpsvc/1').RelayForAuth -like '*0*'"

警告使用单引号将整个命令 ('...') 括起来不能cmd.exe 的预期工作:后者不将这些识别为引用,PowerShell 只是将字符串解释为使用 its 语法来逐字字符串,因此只需 打印 字符串的内容。

如需了解更多信息,请参阅this answer

【讨论】: