Пример Location.csv Я пытаюсь создать одну папку, запрашивая у пользователя идентификатор пользователя и группу, используемую для сопоставления домашней папки.
Приведенный ниже сценарий создает домашнюю папку пользователя в каждом месте, а не в месте, соответствующем подсказке.
Запуск скрипта без цикла foreach не работает.
$Locations = Import-Csv "C:\Scripts\CreateHomeFolder\Location.csv"
$UserName = Read-Host "Enter User Logon Name"
$UserGroup = Read-Host "Enter User's Home drive group"
foreach($Location in $Locations.Location){
if ($Locations.Groups -eq $UserGroup){
New-Item -Name $UserID -Path $Locations.Location -ItemType Directory -Verbose
}
}
что я здесь делаю не так?
Как было сказано, у вас неправильные переменные. Переменная итерации — $location
, и на каждой итерации это объект, взятый из массива $locations
.
Использовать
foreach($Location in $Locations){
if ($Location.Groups -eq $UserGroup){
New-Item -Name $UserID -Path $Location.Location -ItemType Directory -Verbose
}
}
Я слышу вас, однако файл, который я импортирую, имеет формат .csv, а не текстовый файл. Насколько я понимаю, мне нужно ссылаться на столбец «местоположение». Я предполагаю, что вопрос должен заключаться в том, как мне выбрать местоположение, которое соответствует группе из ввода?
@Nuisance Ты пробовал? Это именно то, что сейчас делает цикл. Импорт csv создает массив объектов, которые вы перебираете. Каждый из этих объектов имеет два свойства: группы и местоположение. Вам все еще нужно исправить неопределенную переменную $UserID
.. (должно быть $UserName
)
вернулся к чертежной доске, уточнил поиск в Google и нашел решение: $Locations = Import-Csv "C:\Scripts\CreateHomeFolder\Locations.csv" | Where-Object Groups -eq $UserGroup | select Location New-Item -Name $UserName -Path $Locations.Location -ItemType Directory -Verbose
@Nuisance Конечно, есть и другие способы сделать то, что вы хотели, но ваш вопрос заключался в том, что не так в вашем подходе foreach ..
вернулся к чертежной доске, уточнил поиск в Google и нашел решение:
$Locations = Import-Csv "C:\Scripts\CreateHomeFolder\Locations.csv" | Where-Object Groups -eq $UserGroup | select Location
New-Item -Name $UserName -Path $Locations.Location -ItemType Directory -Verbose
Полезный ответ Тео решает вашу насущную проблему.
Ваш собственный ответ улучшает ваш оригинальный подход, хотя и не используетselect -ExpandProperty Location
— обратите внимание на использование -ExpandProperty
(select
— это встроенный псевдоним для командлета Select-Object) — он создает ненужное дублирование (и накладные расходы на обработку), поскольку приходится дважды ссылаться на Location
.
Другой вариант — использовать прямой доступ к свойствам:
New-Item -Name $UserName -ItemType Directory -Verbose -Path (
(
Import-Csv C:\Scripts\CreateHomeFolder\Locations.csv |
Where-Object Groups -eq $UserGroup
).Location
)
Удалите
.Location
изforeach($Location in $Locations.Location)
. Внутри цикла используйте$Location
, а не$locations