在powershell中投射?奇怪的语法?

mon*_*nny 16 powershell casting powershell-2.0

将XML从文件读入变量可以这样做:

[xml]$x=get-content myxml.xml
Run Code Online (Sandbox Code Playgroud)

但为什么不呢:

$x=[xml]get-content myxml.xml
Run Code Online (Sandbox Code Playgroud)

这使:

Unexpected token 'get-content' in expression or statement.
At line:1 char:20
+ $x=[xml]get-content <<<<  myxml.xml
    + CategoryInfo          : ParserError: (get-content:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken
Run Code Online (Sandbox Code Playgroud)

那就是:为什么在等号的左侧进行强制转换操作,通常在编程语言中,转换是在右侧完成的,如(例如)在java中:

a=(String)myobject;
Run Code Online (Sandbox Code Playgroud)

Dav*_*ant 25

$x=[xml](get-content myxml.xml)
Run Code Online (Sandbox Code Playgroud)

  • 因为`get-content myxml.xml`是一个表达式; `(get-content myxml.xml)`是一个对象.你需要有一个对象开始将其转换为其他东西! (7认同)
  • 为了稍微添加一点,cmdlet周围的括号会强制表达式解析.然后,解析后的表达式(现在是一个对象)将传递给强制转换运算符. (2认同)

小智 5

在 PowerShell 中,一切都是对象。这包括cmdlet。转换是将一种对象类型转换为另一种对象类型的过程。

这对于转换意味着什么,就像在数学中一样,您可以添加不必要的括号来帮助您自己弄清楚到底发生了什么。在数学中,1 + 2 + 3可以变成((1 + 2) + 3)不改变其含义。

对于 PowerShell,转换是在下一个对象(右侧)上执行的,因此$x = [xml] get-content myxml.xml变为$x = ([xml] (get-content)) myxml.xml. 这表明您正在尝试将cmdlet 强制转换为xml对象,这是不允许的。

显然这不是您要尝试执行的操作,因此您必须先执行cmdlet,然后再进行转换,AKA $x = [xml] (get-content myxml.xml)。另一种方法[xml] $x = get-content myxml.xml是将变量声明为该类型,xml以便分配给它的任何内容(也称为等号的整个右侧)都将强制转换为xml