从 powershell 开始,ls -R *.txt
将按目录递归列出文件,或者更好:
PS> Get-ChildItem -Path C:\Test -Name
logs
anotherfile.txt
Command.txt
CreateTestFile.ps1
ReadOnlyFile.txt
但我如何将其输入数组?我想要一个文件(?)对象本身的数组,查看:
Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
https://stackoverflow.com/a/24468733/262852 https://stackoverflow.com/a/24468733/262852
我正在从这些类型的命令中寻找带有 powershell 的“文件”对象数组。
可能更好的语法:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
但我不需要复制这些项目,而是想要一个对象,或者更确切地说,对象数组。不是文件的路径,也不是文件,大概是 powershell 引用或指向文件的指针。
(阅读fine https://learn.microsoft.com/en-us/powershell/scripting/samples/working-with-files-and-folders?view=powershell-6#listing-all-the-files-and-folders-within-a-folder现在手动。)
tl;dr
-
当您在变量中捕获 PowerShell 语句的输出时(例如,
$output = Get-ChildItem ...
), 这是自动地如果有的话收集在一个数组中两个或更多输出对象。
-
确保数组是always使用过 - 即使只有一个single or no输出对象-使用@(...)
(e.g.,
$output = @(Get-ChildItem ...)
)
-
PowerShell cmdlet,例如Get-ChildItem
,可以输出任意数量的对象。
-
When 输出到pipeline,每个输出对象都被传递单独地到管道中的下一个命令通常用于立即处理。
-
When 输出被捕获在variable ($var = ...
),以下逻辑适用:
- If 两个或更多对象是输出,它们被收集在常规 PowerShell 数组中,其类型为
[object[]]
(即使实际元素具有特定类型)。
- If one对象是输出,它是输出as-is;也就是说,它是not包裹在一个数组中。
- If no输出对象,输出“数组值 null”(有时因其类型名称而称为“AutomationNull”),其在表达式上下文中的行为类似于
$null
在枚举上下文中,例如空集合;它导致没有可见的输出 - 请参阅这个答案 https://stackoverflow.com/a/41568525/45375了解详情。
所以,当在变量中捕获时,给定的命令可能情境地 return:
- 对象数组
- 单个对象
- “没有什么” (
[System.Management.Automation.Internal.AutomationNull]::Value
)
确保给定命令的输出是always被视为array,您有两个选择:
-
Use @(...)
, the 数组子表达式运算符 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators#array-subexpression-operator--; e.g.
$fileSystemObjects = @(Get-ChildItem -Recurse -Filter *.txt)
-
对目标变量进行类型约束[array]
(这相当于并且更容易输入,[object[]]
).
[array] $fileSystemObjects = Get-ChildItem -Recurse -Filter *.txt
也就是说,在 PSv3+ 中,您通常不需要担心给定变量是否包含标量(单个值)或数组, 因为标量可以隐式地被视为数组: 你可以打电话.Count
即使在标量上,并使用索引([0]
, [-1]
) - see 这个答案 https://stackoverflow.com/a/44035802/45375了解详情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)