我有一些通过计划任务执行的脚本,并想为它们创建日志文件。
日志文件应该包含所有记录的警告,我想出了这种重定向方法:
$ Write-Warning "I'm a warning!"
WARNING: I'm a warning!
$ Write-Warning "I'm a warning!" 3>$logfile
$ # warning text present in $logfile
这可以按预期工作,但它不适用于 Exchange 命令行管理程序导入的模块:
$ Set-Mailbox $mailbox -HiddenFromAddressListsEnabled $true 3>$logfile
WARNING: The command completed successfully but no settings of 'Path/to/$mailbox' have been modified.
$
$logfile
仍为空。
使用或重定向*>
至也$null
没有任何效果。
我怎样才能捕获这些警告?
答案1
将命令放入Invoke-Command
使用参数中,并在使用该参数的同时-Session
将连接的会话变量 [ ] 传递给您的 Exchange Server 。$session
-WarningVariable
将 Exchange 命令放入其中-ScriptBlock { <Exchange commands> }
,您将能够捕获生成的任何警告消息,并将其Out-File
保存到日志文件中。
电源外壳
$warning = @();
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchangesrv.domain.com/PowerShell/ -Authentication Kerberos;
Invoke-Command -Session $session -ScriptBlock {
Set-Mailbox $args[0] -HiddenFromAddressListsEnabled $true;
} -ArgumentList $mailbox -WarningVariable warning;
$warning | Out-File "c:\Logs\HiddenGALWarnings.txt" -Append;
笔记:尝试时Set-Mailbox $mailbox -HiddenFromAddressListsEnabled $true -WarningVariable $true
,您可能会收到以下错误,原因是RestrictedLanguage mode
A variable that cannot be referenced in restricted language mode or a Data section is being referenced. Variables that can be referenced include the following: $PSCulture, $PSUICulture,
$true, $false, and $null.
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : VariableReferenceNotSupportedInDataSection
+ PSComputerName : exchangesrv.domain.com
支持资源
-
创建与本地或远程计算机的持久连接。
-
-Session
指定此 cmdlet 在其中运行命令的会话数组。输入包含 PSSession 对象的变量或创建或获取 PSSession 对象的命令,例如
New-PSSession
或Get-PSSession
命令。创建 PSSession 时,PowerShell 会与远程计算机建立持久连接。使用 PSSession 运行一系列共享数据的相关命令。要运行单个命令或一系列不相关的命令,请使用
ComputerName
参数 -
-WarningVariable
将有关命令的警告存储在指定的变量中。所有生成的警告都会保存在变量中,即使这些警告未显示给用户。
要将警告附加到变量内容,而不是替换可能已经存储在那里的任何警告,请
+
在变量名称前键入加号 ( )。-WarningVariable +myvar
在 Exchange Online 的远程 PowerShell 会话中将变量与 Invoke-Command 结合使用