这个powershell脚本可以做成一行吗?

Can this powershell script be made as a one-liner?

如题,"script"这一块可以做成单行吗?最好没有分号。

为什么?只是为了其中的乐趣和教育部分

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

这可能有效(PSv4+;也可用作 one-liner 的单个语句):

(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, even though it expects a mailbox argument, doesn't directly accept the [Microsoft.Exchange.Data.Directory.Management.Mailbox] instance stored in $mbx, so $mbx.PrimarySmtpAddress.ToString() is needed; thanks, NiklasJ.

虽然很容易混淆,但很容易使简洁变得优雅,尤其是在行太长的情况下。

以上是前者,使用 跨多行的单个语句 缩进阐明结构。

  • 请注意,由于换行符的放置方式,不需要使用`来续行。

  • 请注意 $mbx 如何在表达式中早期赋值并在命令中稍后重用。

  • 注意使用带有模式参数 First 的 PSv4+ 集合运算符 .Where(...),这是 | Where-Object ... | Select-Object -First 1

    [= 的更有效替代方法55=]
  • 该命令的输出是使用 Select-Object 创建的所有对象,其 .User.DisplayName 值为字符串 Test.

    • 要实现原始命令的输出,您需要追加的只是 .User.DisplayName,但请注意,这只会输出任意数量的 Test 字符串实例(或其大小写变体),而无需进一步上下文。

在我看来,显而易见的答案是创建一个函数:

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

函数可以是dot sourced from a .ps1 file or can be automatically loaded (Powershell 3.0 and newer) by creating a module.

您的一班班轮将是:

Start-OneLiner -name a mailbox

我找到了另一种有效的解决方案,它是 的 mock-up,但有选择地定义了 sub-properties 收集的内容,然后将特定值解析到查询中.

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