Get-Content .csv и использовать его как переменную для имени пути

Я пытаюсь использовать 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"
}

2 ответа

Вы говорите сценарию в основном назначить все имя пользователя $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, указав заголовок.

      $username = Import-Csv -Path \path\to.csv -Header UserName
Другие вопросы по тегам