Powershell Create-item создает несколько папок в списке

Пример 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 из foreach($Location in $Locations.Location). Внутри цикла используйте $Location, а не $locations

Theo 25.12.2020 22:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
280
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как было сказано, у вас неправильные переменные. Переменная итерации — $location, и на каждой итерации это объект, взятый из массива $locations.

Использовать

foreach($Location in $Locations){
    if ($Location.Groups -eq $UserGroup){
        New-Item -Name $UserID -Path $Location.Location -ItemType Directory -Verbose
    }
}

Я слышу вас, однако файл, который я импортирую, имеет формат .csv, а не текстовый файл. Насколько я понимаю, мне нужно ссылаться на столбец «местоположение». Я предполагаю, что вопрос должен заключаться в том, как мне выбрать местоположение, которое соответствует группе из ввода?

Nuisance 26.12.2020 10:43

@Nuisance Ты пробовал? Это именно то, что сейчас делает цикл. Импорт csv создает массив объектов, которые вы перебираете. Каждый из этих объектов имеет два свойства: группы и местоположение. Вам все еще нужно исправить неопределенную переменную $UserID .. (должно быть $UserName)

Theo 26.12.2020 11:14

вернулся к чертежной доске, уточнил поиск в 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 26.12.2020 11:22
Решение @Theo, это статья, которая указала мне на короткое решение.
Nuisance 26.12.2020 12:04

@Nuisance Конечно, есть и другие способы сделать то, что вы хотели, но ваш вопрос заключался в том, что не так в вашем подходе foreach ..

Theo 26.12.2020 12:07
Ответ принят как подходящий

вернулся к чертежной доске, уточнил поиск в 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
)

Другие вопросы по теме