我正在编写一个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
我很抱歉这个问题如此严重,我不知道如何更好地解释它。
非常感谢任何帮助。
答案 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