正如标题所说,这段"脚本"被制作成一个班轮?最好不要用分号。
为什么呢?只是为了它的乐趣和教育部分完全。
$mbx=get-mailbox "a mailbox"
$calendar=$($mbx.PrimarySmtpAddress.toString()) + ":\" + (Get-MailboxFolderStatistics $mbx.PrimarySmtpAddress.toString() | Where-Object { $_.Foldertype -eq 'Calendar' } | Select-Object -First 1).Name
$var=Get-MailboxFolderPermission -Identity $calendar -ErrorAction SilentlyContinue | select-object @{Label="Identity";expression={$mbx.Alias}},FolderName,User,AccessRights
$var.Foreach({ if ($_.User.DisplayName -eq 'Test') { $_.User.DisplayName }})
我最接近的是3行:
$mbx=get-mailbox "a mailbox"
$Perm=Get-MailboxFolderPermission -Identity $($mbx.PrimarySmtpAddress.toString() + ":\" + (Get-MailboxFolderStatistics $mbx.PrimarySmtpAddress.toString() | Where-Object { $_.Foldertype -eq 'Calendar' } | Select-Object -First 1).Name) | Select-Object @{Label="Identity";expression={$mbx.Alias}},FolderName,User,AccessRights
$Perm.Foreach({ if ($_.User.DisplayName -eq 'Test') { $_.User.DisplayName }})
编辑:
我走了几步,但这需要输入两次邮箱。
@(Get-MailboxFolderPermission -Identity $($(Get-Mailbox "a mailbox" | select-Object -ExpandProperty PrimarySmtpAddress).toString() + ":\" + (Get-MailboxFolderStatistics $(Get-Mailbox "a mailbox" | select-Object -ExpandProperty PrimarySmtpAddress).toString() | Where-Object { $_.Foldertype -eq 'Calendar' } | Select-Object -First 1).Name)).Foreach({ if ($_.User.DisplayName -eq 'Test') { $_.User.DisplayName }})
答案 0 :(得分:2)
这可能有效(PSv4 +;单个声明也可以作为一个单行):
(Get-MailboxFolderPermission -Identity (
($mbx=Get-Mailbox 'a mailbox').PrimarySmtpAddress.ToString() + ":\" + #"
(Get-MailboxFolderStatistics $mbx.PrimarySmtpAddress.ToString()).
Where({$_.FolderType -eq 'Calendar'}, 'First').Name
) | Select-Object @{Label='Identity';expression={$mbx.Alias}},FolderName,User,AccessRights
).Where({ $_.User.DisplayName -eq 'Test' })
请注意Get-MailboxFolderStatistics
,即使它需要邮箱参数,也不会直接接受[Microsoft.Exchange.Data.Directory.Management.Mailbox]
中存储的$mbx
实例,所以需要$mbx.PrimarySmtpAddress.ToString()
;谢谢,NiklasJ。
在简洁中可以有优雅,但是很容易陷入混淆,特别是过长的线条。
上述内容力求前者,使用单个语句分布在多行上,并使用缩进来澄清结构。
请注意,由于放置换行符的方式,使用`
进行换行是
请注意如何在表达式中尽早分配$mbx
并在命令中稍后重复使用。
请注意PSv4 +集合运算符.Where(...)
与模式参数First
一起使用,这是| Where-Object ... | Select-Object -First 1
命令输出是使用Select-Object
.User.DisplayName
值为字符串Test
创建的所有对象。
.User.DisplayName
,但请注意,这只会输出任意数量的Test
字符串实例(或其大小写变体),没有进一步的背景。答案 1 :(得分:0)
$mbx=get-mailbox "a mailbox"; $Perm=Get-MailboxFolderPermission -Identity $($mbx.PrimarySmtpAddress.toString() + ":\" + (Get-MailboxFolderStatistics $mbx.PrimarySmtpAddress.toString() | Where-Object { $_.Foldertype -eq 'Calendar' } | Select-Object -First 1).Name) | Select-Object @{Label="Identity";expression={$mbx.Alias}},FolderName,User,AccessRights; $Perm.Foreach({ if ($_.User.DisplayName -eq 'Test') { $_.User.DisplayName }})
答案 2 :(得分:0)
在我看来,显而易见的答案是创建一个函数:
Function Start-OneLiner
{
Param
(
[String]
$Name
)
$mbx=Get-Mailbox $Name
$calendar=$($mbx.PrimarySmtpAddress.toString()) + ":\" + (Get-MailboxFolderStatistics $mbx.PrimarySmtpAddress.toString() | Where-Object { $_.Foldertype -eq 'Calendar' } | Select-Object -First 1).Name
$var=Get-MailboxFolderPermission -Identity $calendar -ErrorAction SilentlyContinue | select-object @{Label="Identity";expression={$mbx.Alias}},FolderName,User,AccessRights
$var.Foreach({ if ($_.User.DisplayName -eq 'Test') { $_.User.DisplayName }})
}
一个函数可以是.ps1
文件中的dot sourced,也可以是automatically loaded的creating a module(Powershell 3.0及更新版本)。
你的一个班轮将是:
Start-OneLiner -name a mailbox
答案 3 :(得分:0)
我已经达到了另一个有效的解决方案,一个是mklement0's answer的模型,但是有选择地定义了收集了哪些子属性,然后解析了查询中的特定值。
One-liner:
(Get-MailboxFolderPermission -Identity ( ( $mbx=(Get-Mailbox 'a mailbox' | select-object Identity,PrimarySmtpAddress,Alias) ).PrimarySmtpAddress.ToString() + ":\" + ((Get-MailboxFolderStatistics $mbx.Identity).Where{$_.FolderType -eq 'Calendar'}|Select-Object -First 1).Name )| Select-Object @{Label='Identity';expression={$mbx.Alias}},FolderName,User,AccessRights).Where({ $_.User.DisplayName -eq 'Test' })
可读:
(
Get-MailboxFolderPermission -Identity (
( $mbx=(Get-Mailbox 'a mailbox' | select-object Identity,PrimarySmtpAddress,Alias) ).PrimarySmtpAddress.ToString() + ":\" + #"
(
(Get-MailboxFolderStatistics $mbx.Identity).Where{
$_.FolderType -eq 'Calendar'
}
|Select-Object -First 1
).Name
)
| Select-Object @{Label='Identity';expression={$mbx.Alias}},FolderName,User,AccessRights
).Where(
{ $_.User.DisplayName -eq 'Test' }
)