使用 select-object @name="Name"; 时出现问题表达式=$变量

Posted

技术标签:

【中文标题】使用 select-object @name="Name"; 时出现问题表达式=$变量【英文标题】:Problem using select-object @name="Name"; expression=$variable使用 select-object @name="Name"; 时出现问题表达式=$变量 【发布时间】:2020-04-17 07:10:46 【问题描述】:

我尝试过这样的事情,但它从来没有给出值,我的 ifile.csv 包含两列 displayname,grpmail

Import-Csv "E:\ifile.csv" | foreach get-distributionGroupMember -Identity $_.displayname | select-Object @Name= GroupName; Expression = $_.grpmail, Recipienttype, Primarysmtpaddress | Export-csv -no typeinformation "E:\Ofile.csv"

谁能告诉我我做错了什么 我期待 ofile.csv 包含 3 列作为 GroupName、Recipienttype、Primarysmtpaddress

我获取 Recipienttype、Primarysmtpaddress 列的值,但 GroupName 列始终为空。

【问题讨论】:

您的代码中有很多令人讨厌的地方。仅通过 Powershell ISE 中的代码突出显示,您应该能够识别一些问题。我也不相信您的代码正在运行而不会引发任何错误。不过,您的基本方法是正确的。 csv的分隔符是,还是别的什么? 请测试一下:Import-Csv "E:\ifile.csv" | foreach $_.displayname ; $_.grpmail | fl 【参考方案1】:

这是因为您在管道中的 $_ 已更改为您的 get-distributiongroupmember 的结果,并且不再是您的 CSV 文件输入。

试试这个:

Import-Csv "E:\ifile.csv" | foreach 
$gname = $_.grpmail
Get-distributionGroupMember -Identity $_.displayname | Select @Name= GroupName; Expression = $gname, Recipienttype, Primarysmtpaddress | Export-csv -no typeinformation "E:\Ofile.csv"

我刚刚拆分了第 2 行和第 3 行以使其更易于阅读 - 如果您愿意,您可以在 $gname = $_.grpmail 之后添加一个分号。

作为一般说明,我喜欢为管道对象分配特定的变量名称,以查看我实际使用的内容,尤其是在它们正在被转换的过程中。另外,我喜欢使用多行来更好地了解正在发生的事情

foreach ($g in (Import-Csv "E:\ifile.csv")) 
    Get-distributionGroupMember -Identity $g.displayname | 
    Select @Name= GroupName; Expression = $g.grpmail,Recipienttype,Primarysmtpaddress
 | Export-csv -notypeinformation "E:\Ofile.csv"

【讨论】:

【参考方案2】:

编辑 按照 T-Me 的建议,试试这个:

Import-Csv "E:\ifile.csv" | ForEach-Object 
    $grpmail = $_.grpmail
    get-distributionGroupMember -Identity $_.displayname | Select-Object @ Name = 'GroupName'; `
                                                                            Expression = "$grpmail" , `
                                                                            Recipienttype, Primarysmtpaddress
 | Export-csv -no typeinformation "E:\Ofile.csv"

【讨论】:

这不会解决问题,但在每行的GroupName 字段中写入字符串grpmail... 就像,Import-Csv "E:\ifile.csv" | ForEach-Object $grpmail = $_.grpmail get-distributionGroupMember -Identity $_.displayname |选择对象@ Name = 'GroupName';表达式 = "$grpmail" ,收件人类型,Primarysmtpaddress | export-csv -no typeinformation "E:\Ofile.csv" 是的,现在它是正确的并且可以工作。但是现在和@trix的回答一样 你不需要反引号。是的,花括号在选择中的位置错误。 我的意思是你可以只用逗号继续一行。你也可以去掉分号。

以上是关于使用 select-object @name="Name"; 时出现问题表达式=$变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Select-object 在单个查询中获取进程和线程的详细信息?

powershell 概念证明:使用Select-Object计算属性的简化语法

PowerShell Select-Object Property和ExpandProperty的差别

PowerShell Select-Object 保留排序后一定数量的首尾行

powershell use calculated properties

django 在这种情况下如何使用Q和过滤related_name?