这个powershell脚本可以作为一个单行程吗?

时间:2018-03-27 13:06:20

标签: powershell scripting office365 exchange-server

正如标题所说,这段"脚本"被制作成一个班轮?最好不要用分号。

为什么呢?只是为了它的乐趣和教育部分完全

$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 }})

4 个答案:

答案 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 loadedcreating 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' }
)