我正在尝试在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
也无法解决问题。
答案 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:)
欢呼