Foreach возвращает значение много раз - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь работать в графическом интерфейсе PowerShell и у меня возникает проблема с приглашением foreach.

elseif ($ListBox1.SelectedItem -eq 'Specified User Info'){
    [void]$list = $Listbox3.SelectedItem
    $Users = $Textbox.Text

    $DateType1 = Get-ADUser <user> -Properties * |
                 Get-Member -MemberType Properties |
                 where {$_.Definition -like "*int64*"}

    $DateData1 = foreach ($member in $DateType1) {
        $data = $member.Name
        Get-ADUser $Users -Property $data |
            Select @{name=$data;e={[DateTime]::FromFileTime($_."$data")}} |
            select -Unique $list |
            Out-String
    }

    switch ($listbox3.selecteditem) {
        {$Datetype1.Name -contains $_} {$TextBox1.Text = $DateData1}
        default                        {$TextBox1.Text = $UserInfo}
    }
}

Как показано в коде, я пытаюсь получить в переменную свойства int64, а затем выполнитьпреобразование этих свойств в читаемые данные даты.

Проблема заключается в том, что, когда я получаю результат в своем текстовом поле, например PwdLastSet.результат покажет PwdLastSet столько раз, сколько данных хранится в моей переменной, и один из них PwdLastSet содержит ожидаемый результат "дата и время".

Как ни странно, это не происходило несколько днейназад, так что это довольно напрягает, и я откровенно потерян.

Я пытался использовать подсказку ForEach-Object или другой тип переменной в $DateData1, но результат все тот же.Даже Select -Unique $List не решил проблему.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Что произойдет, если вы замените следующее:

$DateData1 = foreach ($member in $DateType1){$data = $member.name
Get-ADUser $Users -property $data | Select @{name=$data;e={[datetime]::FromFileTime($_."$data")}} | select -unique $list | out-string}

С:

$DateData1 = get-aduser $users -property $datetype1.name | select $datetype1.name

foreach ($prop in $DateType1.name) {
$DateData1.$prop = [datetime]::FromFileTime($DateData1.$prop)
}

Теперь $DateData1 будет содержать объект ADUser со всеми полями, преобразованными в желаемый формат даты и времени. Затем вы можете манипулировать вещами оттуда.

Чтобы извлечь содержимое $DateData1 в виде строки:

$DateData1 | Out-String

Чтобы получить значение свойства, переданного в оператор switch, как тип datetime:

switch ($item) {
{$Datetype1.name -contains $_}{$TextBox1.text = $DateData1.$_}}

Чтобы получить значение свойства, переданного в оператор switch, в виде строки:

switch ($item) {
{$Datetype1.name -contains $_}{$TextBox1.text = $DateData1.$_.ToString()}}

Чтобы получить имя и значение свойства в одной строке, вы можете использовать оператор форматирования (-f) для форматирования внешнего вида вашего вывода. Вывод также является строкой:

switch ($item) {
{$Datetype1.name -contains $_}{$TextBox1.text = "{0}: {1}" -f $_,$DateData1.$_}}
0 голосов
/ 20 марта 2019

Дополнительно к вашему ответу @AdminOfThings я нашел более простой способ, который, кажется, работает просто отлично.Уловка заключалась в том, чтобы вообще не использовать " Foreach "

$DateType1 = Get-ADUser <user> -properties * | Get-Member -membertype properties | where {$_.Definition -like "*int64*"} | select name
$list = $Listbox3.SelectedItem
$Users = $Textbox.Text

$DateData1 = Get-ADUser $Users -property $DateType1.name | Select @{name=$list;e={[datetime]::FromFileTime($_."$list")}} | out-string

Switch($listbox3.selecteditem){
{$Datetype1.name -contains $_}{$ResultBox.Text = $Datedata1}

$ listbox3.selectedItem - это атрибуты, которые будут иметь преобразование $ Textbox.text - это то место, где вводится имя пользователя

Я не знаю, почему я не подумал об этом раньше, но, похоже, работает так же хорошо, как то, что вы мне дали, еще раз спасибо@AdminOfThings:)

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...