Чтение 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
}
Когда вы используете
ForEach-Object
, вам нужно вернуть текущий объект, чтобы он прошел через конвейер и в следующий цикл foreach. Вы можете использоватьreturn
для этого или просто введите текущую переменную объекта ($_
) в конце.Поскольку вы проходите
$owner
, цитаты заключать не нужно. Просто используйте переменную.Не используйте одинарные кавычки для переменных, потому что одиночные кавычки выводят строку с буквальным текстом, который вы ввели. Так что это буквально
$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
}