(Powershell)新对象cmdlet不会使用[CodeDom.Compiler.TempFileCollection]返回任何内容

时间:2013-05-29 09:01:13

标签: powershell

我正在编写一个Powershell脚本,我必须在其中创建几个临时文件。我偶然发现了一个非常有用的.net类来管理这个任务:[System.CodeDom.Compiler.TempFileCollection]。

然而由于一些奇怪的原因,我无法创建一个对象。 这是我试图做的事情:

$a = new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\"
此次通话后,

$ a为空。

但是,如果我这样做:

(new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\").tempdir

它返回:

C:\folder1\

这意味着已创建一个对象。我似乎无法将其保存到变量中!有没有人知道为什么会这样?

另一件奇怪的事情:

new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\" | gm

返回:

Name          MemberType Definition                                                                                         
----          ---------- ----------                                                                                         
AddExtension  Method     string AddExtension(string fileExtension), string 
...

但是这会返回一个异常(Get-Member:没有为get-member cmdlet指定对象。):

(new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\") | gm

我很抱歉这个问题如此严重,我不知道如何更好地解释它。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

TL; DR:它不是空的。

你如何确认$ a是空的?我想如果你真的尝试使用它,它会正常工作:

PS> $a = New-Object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\"
PS> $a.TempDir
C:\folder1\
PS> $a.AddFile("test1.txt",$false)
PS> $a.AddFile("test2.txt",$false)
PS> $a
C:\Users\Jaykul\AppData\Local\Temp\test2.txt
C:\Users\Jaykul\AppData\Local\Temp\test1.txt
PS>

简而言之,您遇到的问题是,当您通过管道发送集合时,PowerShell会展开集合(即,它会输出集合的CONTENTS)。那是因为否则,当你输入:

PS> $a = Get-ChildItem
PS> $a

您只会看到它是一个数组:System.Object[] ...

在这种情况下,您几乎总是希望看到数组的内容。顺便说一句:这是PowerShell如何 首先一种shell语言,然后是一种脚本语言的一个很好的例子:它优先考虑shell的正确行为。

无论如何,对于可枚举集合的展开有一些例外(字符串是IEnumerable,但没有展开),事实上,我认为New-Object ... |是特殊的,这就是为什么它适用于管道新 - 根目标获取会员。当然,一旦你将它包装在括号中,你就创建了一个单独解析的子表达式,所以当你写:

(new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\") | gm

你基本上有两个管道,New-Object的特殊处理消失,你的集合被展开,它的内容(没有,因为它是空的)传递给管道。

您可以使用一元逗号运算符来避免这种情况:

$a = new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\"
,$a | gm

或     ,(new-object CodeDom.Compiler.TempFileCollection -argumentlist“C:\ folder1 \”)|克

或直接将其传递给-InputObject参数,而不是通过管道。

$a = new-object CodeDom.Compiler.TempFileCollection -argumentlist "C:\folder1\"
gm -InputObject $a

但是,当您使用花哨的集合,并且想要查看集合对象本身属性的时,您可能需要同时执行这两项操作:

PS> ft -in (,$a)

    Count TempDir            BasePath                    KeepFiles SyncRoot               IsSynchronized
    ----- -------            --------                    --------- --------               --------------
        3 C:\folder1\        C:\folder1\t22jmahj             False                                 False