我对powershell很陌生,所以如果我说这一切都错了,我也不会感到惊讶。我正在尝试创建一个函数,在执行时,打印格式化为表格的结果。也许甚至可以将这些结果传递给另一个函数进行进一步分析。
这是我到目前为止所拥有的。这是一个简单的函数,它遍历路径列表并收集目录的名称和该目录中的项目数,将数据放入哈希表中,并返回一个哈希表数组:
function Check-Paths(){
$paths =
"C:\code\DirA",
"C:\code\DirB"
$dirs = @()
foreach ($path in $paths){
if (Test-Path $path){
$len = (ls -path $path).length
}
else{
$len = 0
}
$dirName = ($path -split "\\")[-1]
$dirInfo = @{DirName = $dirName; NumItems = $len}
$dirs += $dirInfo
}
return $dirs
}
这似乎很简单。但是,当我运行命令时,这就是我得到的:
PS > Check-Paths
Name Value
---- -----
DirName DirA
NumItems 0
DirName DirB
NumItems 0
我想要的是这样的:
DirName NumItems
------- --------
DirA 0
DirB 0
我可以破解我的函数来使用write
语句,但我认为必须有一个更好的方法来做到这一点。有没有办法将数据格式化为表格,如果可以将其传输到另一种方法,那就更好了吗?
答案 0 :(得分:10)
如何'回合使用
return new-object psobject -Property $dirs
这将返回一个对象,其属性与哈希表中的项匹配。然后,您可以使用内置的PowerShell格式化cmdlet使其看起来像您想要的那样。由于您只有2个属性,因此默认情况下它将被格式化为表格。
编辑:这是整个事情的样子(在各种建议之后):
function Check-Paths(){
$paths =
"C:\code\DirA",
"C:\code\DirB"
$dirs = @()
foreach ($path in $paths){
if (Test-Path $path){
$len = (ls -path $path).length
}
else{
$len = 0
}
$dirName = ($path -split "\\")[-1]
new-object psobject -property @{DirName = $dirName; NumItems = $len}
}
}
答案 1 :(得分:1)
这是一个单行班,可以为您提供每个文件夹的子项数。
"C:\code\DirA", "C:\code\DirB" | ? {Test-Path $_} | Get-Item | select -property Name, @{ Name="NumOfItems" ; Expression = {$_.GetFileSystemInfos().Count} }
它将一个字符串数组传递给Where-Object
以选择存在的字符串。存在的路径字符串将传递给Get-Item
,以获取传递给Select-Object
的FileSystemObjects以创建PSCustomObject
个对象。 PSCustomObjects有两个属性,即目录名和子项数。
如果您希望输出的表格列更靠近在一起,您可以将上述内容输入:Format-Table -AutoSize
示例用法和输出:
dir | ? {$_.PsIsContainer} | select -property Name, @{ Name="NumOfItems" ; Expression = {$_.GetFileSystemInfos().Count} } | Format-Table -AutoSize
Name NumOfItems
---- ----------
Desktop 12
Favorites 3
My Documents 3
Start Menu 2