这个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' }
)
如题,"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
如何在表达式中早期赋值并在命令中稍后重用。注意使用带有模式参数
[= 的更有效替代方法55=]First
的 PSv4+ 集合运算符.Where(...)
,这是| Where-Object ... | Select-Object -First 1
该命令的输出是使用
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
我找到了另一种有效的解决方案,它是
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' }
)