Чтение Powershell из набора переменных CSV

Я надеялся, что смогу получить руководство.

У меня есть CSV-файл с двумя столбцами "Путь" и "Владелец"

Я создал скрипт Belkow, и он может читать из CSV-файла, но когда я пытаюсь назначить переменные из CSV-файла, он терпит неудачу.

Я не вижу, где я иду не так. Любая помощь будет оценена.

import-csv c:\test\output.csv | foreach-object {
  $Path = $_.path
  $owner =$_.owner
  "The username is $Path and the owner is $owner"
}
ForEach-Object {
         $Path = $_.path
         $owner =$_.owner
         $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList '$owner';
         $Acl = Get-Acl -Path $path ; 
    $Acl.SetOwner($Account);
    Set-Acl -Path $owner -AclObject $Acl; 
    }

Вывод корректен из первого сегмента и показывает путь и владельца, но вторая часть не устанавливает владельца в соответствии с путем.

Спасибо

1 ответ

Решение

Второй foreach не имеет входного объекта для повторения. Так что либо

  • импортировать в переменную и передать ее дважды в циклы foreach
  • импортировать дважды

$csv = import-csv c:\test\output.csv 
$csv | foreach-object {
  $Path = $_.path
  $owner =$_.owner
  "The username is $Path and the owner is $owner"
}
$csv | ForEach-Object {
    $Path = $_.path
    $owner =$_.owner
    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList "$owner"
    $Acl = Get-Acl -Path $path
    $Acl.SetOwner($Account);
    Set-Acl -Path $Path -AclObject $Acl
}
  1. Когда вы используете ForEach-Object, вам нужно вернуть текущий объект, чтобы он прошел через конвейер и в следующий цикл foreach. Вы можете использовать return для этого или просто введите текущую переменную объекта ($_) в конце.

  2. Поскольку вы проходите $owner, цитаты заключать не нужно. Просто используйте переменную.

  3. Не используйте одинарные кавычки для переменных, потому что одиночные кавычки выводят строку с буквальным текстом, который вы ввели. Так что это буквально $owner а не ценность $owner переменная.

Код:

Import-Csv C:\test\output.csv | ForEach-Object {
    $Path = $_.path
    $owner = $_.owner
    "The username is $Path and the owner is $owner"
    return $_ # Returning current object
}
ForEach-Object {
    $Path = $_.path
    $owner = $_.owner

    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $owner # No quotations
    $Acl = Get-Acl -Path $Path
    $Acl.SetOwner($Account)

    Set-Acl -Path $owner -AclObject $Acl
}

Кроме того, вам не нужны 2 петли по каждому элементу. Почему бы просто не присоединиться к ним? Вы можете использовать Write-Host чтобы вывести нужную строку.

Import-Csv C:\test\output.csv | ForEach-Object {
    $Path = $_.path
    $owner = $_.owner
    Write-Host "The username is $Path and the owner is $owner"

    $Account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $owner
    $Acl = Get-Acl -Path $Path
    $Acl.SetOwner($Account)

    Set-Acl -Path $owner -AclObject $Acl
}
Другие вопросы по тегам