【问题标题】:Nothing prints in text file文本文件中不打印任何内容
【发布时间】:2014-12-03 16:08:12
【问题描述】:

你学到的关于编程的一件事就是总是处理错误。 但是,在这种情况下,我的程序没有错误;似乎什么都没有打印。 我只需要两列中的组名和管理信息。你能解释一下为什么没有输出吗?

Import-Module ActiveDirectory

$exportlist = "C:\Temp\managedby.txt"

Clear-Content $exportlist

$Header = `
"Group ID Name" + "|" + "ManagedBy"

$Header | Out-File $exportlist -Append

$list = get-adgroup -properties name, managedby -filter {name -notlike "WA*" -or name -notlike "workstation*"} `
| Select name, managedby

$listing =`
$list.name + "|" + $list.managedby

$listing | Out-File $exportlist -Append

这是我在 PowerShell 中运行时出现的结果:

PS F:\> $Header = `
>> "Group ID Name" + "|" + "ManagedBy"
>>
PS F:\> write-host $Header
Group ID Name|ManagedBy
PS F:\> $list = get-adgroup -properties name, managedby -filter {name -notlike "WA*" -or name -notlike "workstation*"} `
>> | Select name, managedby
PS F:\> $listing =`
>>    $list.name + "|" + $list.managedby
PS F:\> write-host $listing
|

看起来$listing 什么都没有?

【问题讨论】:

  • 您是否尝试将$Header$listing 发送到屏幕上只是为了看看它们是否真的包含任何内容?
  • 请看我的编辑。唯一打印的是我的“|”行
  • 那么问题是 nothing 被放入文本文件还是 只有标题 显示在文本文件中?
  • 在我看来 Get-ADGroup 不会产生结果,或者结果对象具有空的 namemanagedby 属性。通过单独运行 Get-ADGroup -Properties name, managedby -Filter {Name -notlike "WA*" -or Name -notlike "workstation*"} 来验证这一点。

标签: powershell output


【解决方案1】:

经过深思熟虑:最可能的情况可能是您使用的是 PowerShell v2 并且Get-ADGroup 产生了多个结果。在 PowerShell v2 中,$list.Name 不会扩展为所有数组元素的Name 属性列表,而是数组对象的(不存在的)属性Name,从而导致$null,然后将其转换为字符串连接时的空字符串。

PowerShell v2 中的属性扩展:

PS C:\Temp> $PSVersionTable.PSVersion.ToString()
2.0
PS C:\Temp> $f = Get-ChildItem
PS C:\Temp> $f

    Directory: C:\Temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        03.12.2014     20:38          0 a.txt
-a---        03.12.2014     20:38          0 b.txt

PS C:\Temp> $f.Name
PS C:\Temp> $f | select -Expand Name
a.txt
b.txt

PowerShell v3 中的属性扩展:

PS C:\Temp> $PSVersionTable.PSVersion.ToString()
3.0
PS C:\Temp> $f = Get-ChildItem
PS C:\Temp> $f

    Directory: C:\Temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        03.12.2014     20:38          0 a.txt
-a---        03.12.2014     20:38          0 b.txt

PS C:\Temp> $f.name
a.txt
b.txt
PS C:\Temp> $f | select -expand Name
a.txt
b.txt

话虽如此,您的目标似乎是将 AD 组的名称和管理员导出到文件中,并以| 字符分隔。但是,您尝试方式 太努力了。您只需使用Export-Csv cmdlet 即可轻松完成此操作,它允许您指定您喜欢的任何分隔符。

Import-Module ActiveDirectory

$exportlist = 'C:\Temp\managedby.txt'

$attr = 'Name', 'ManagedBy'
$fltr = { Name -notlike "WA*" -or Name -notlike "workstation*" }

Get-ADGroup -Properties $attr -Filter $fltr | Select $attr |
  Export-Csv $exportlist -NoType -Delimiter '|'

如果您想要管理器的名称而不是专有名称,请使用 calculated property 来解析它:

Get-ADGroup -Properties $attr -Filter $fltr |
  Select Name, @{n='ManagedBy';e={Get-ADObject -Identity $_.ManagedBy | select -Expand Name}} |
  Export-Csv $exportlist -NoType -Delimiter '|'

【讨论】:

  • 谢谢。 -noType -Delimiter '|'似乎成功了。欣赏!
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多