Foreach多次返回值

时间:2019-03-19 14:26:53

标签: powershell loops foreach

我正在尝试在PowerShell GUI中工作,并且出现了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 个答案:

答案 0 :(得分:1)

如果替换以下内容,会发生什么:

$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语句中的属性的值,请执行以下操作:

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.$_}}

答案 1 :(得分:0)

除了您的答案@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:)

欢呼