0

我正在尝试使用 Get-Content 并创建一个变量,该变量将根据文件的每一行填写目录路径名。

我在 .csv 文件中有很长的用户列表,我想检查他们的每个用户名以获取目录大小。

如果我删除 $username 变量并在 $startdirectory 的末尾手动键入用户名,该脚本将起作用。

$username = Get-Content 'C:\Scripts\AvayaUsers.csv'
$startDirectory = '\\xx\xxxx\xxxxxxxxxxx\users\$username'
 
$directoryItems = Get-ChildItem $startDirectory | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
 
foreach ($i in $directoryItems)
{
    $subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
    $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1GB) + " GB"
}
4

2 回答 2

1

您告诉脚本基本上将整个$username分配为变量,并且您不会循环遍历它。

这意味着所有用户的整个变量都分配给$startDirectory。我很确定该脚本仅适用于 CSV 中的一个用户。

您需要循环使用CSV中包含的每个用户,然后在求和时获取文件大小。

于 2021-04-13T00:08:55.047 回答
1

正如其他人指出的那样,您将所有用户分配到路径的末尾,而不是一个一个地分配每个用户。每个用户都需要另一个循环。除此之外,还有一些其他的事情需要注意。

$startDirectory = '\\xx\xxxx\xxxxxxxxxxx\users\$username'

变量不能用单引号展开,应该是双引号。

$i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1GB) + " GB" 

似乎您无法在串联或插值之间做出决定。有些人会争论一种方式,反之亦然。我建议只选择一个并保持一致。

解决了这些问题后,您最终可能会得到类似的结果。

$username = Get-Content 'C:\Scripts\AvayaUsers.csv'

foreach ($user in $username)
{
    $startDirectory = "\\xx\xxxx\xxxxxxxxxxx\users\$user"

    $directoryItems = Get-ChildItem $startDirectory -Directory | Sort-Object

    foreach ($i in $directoryItems)
    {
        $subFolderItems = Get-ChildItem $i.FullName -File -Recurse -Force | Measure-Object -property Length -sum | Select-Object Sum

        "{0} -- {1:N2}" -f $i.FullName,"$($subFolderItems.sum / 1GB) GB"
    }
}

此外,如果它是 CSV,则最好将其视为 CSV。如果它是单个列表,您仍然可以通过指定标题将其用作 CSV。

$username = Import-Csv -Path \path\to.csv -Header UserName
于 2021-04-13T01:21:19.003 回答