Get-Content .csv 并将其用作路径名的变量
Get-Content .csv and use that as a variable for a path name
我正在尝试使用 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"
}
您是在告诉脚本基本上将整个 $username 分配为一个变量,而不是循环遍历它。
这意味着包含所有用户的整个变量都分配给了 $startDirectory。我很确定该脚本仅适用于 CSV 中的一个用户。
您需要使用 foreach 循环包含在 CSV 中的每个用户,然后在求和时获取文件大小。
正如其他人所指出的,您将所有用户分配到路径的末尾,而不是一个接一个地分配给每个用户。每个用户都需要另一个循环。除此之外还有一些需要注意的地方。
$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。如果它是单个列表,您仍然可以通过指定 header.
将其用作 CSV
$username = Import-Csv -Path \path\to.csv -Header UserName
我正在尝试使用 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"
}
您是在告诉脚本基本上将整个 $username 分配为一个变量,而不是循环遍历它。
这意味着包含所有用户的整个变量都分配给了 $startDirectory。我很确定该脚本仅适用于 CSV 中的一个用户。
您需要使用 foreach 循环包含在 CSV 中的每个用户,然后在求和时获取文件大小。
正如其他人所指出的,您将所有用户分配到路径的末尾,而不是一个接一个地分配给每个用户。每个用户都需要另一个循环。除此之外还有一些需要注意的地方。
$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。如果它是单个列表,您仍然可以通过指定 header.
将其用作 CSV$username = Import-Csv -Path \path\to.csv -Header UserName