New-MoveRequest -Whatif 返回类型

New-MoveRequest -Whatif 返回类型

我正在尝试查找新 moverequest 是否存在任何问题。因此,我在 New-MoveRequest 函数中使用 -WhatIf 开关。我注意到,如果 moverequest 没有问题,此函数会输出类似 的内容What If: Creating New-MoveRequest for 'John Doe'。问题是,我无法将此消息分配给任何变量。此​​消息(输出)来自哪里?

New-MoveRequest -Remote -Identity $userAddress -RemoteHostName $rhn -RemoteCredential $SourceCredential -WhatIf

答案1

您的答案是返回类型为 void。它不返回任何内容,因为 switch-WhatIf旨在不运行任何内容。它仅测试命令将执行的操作,并将该信息写入主机。

写主机

$a = Write-Host "Test string"
# Test String will output to console
# $a will be null because the output will go to the console

$a = Write-Host "Test string" | Write-Output "C:\output.txt"
# Test String will output to console
# $a will be null, and output.txt will be empty because the output will go to the console

Write-Host 的输出被明确发送到控制台。它不能被存储到变量或通过管道传送到另一个命令,因为这是标准输出流的用途。

写入输出

Write-Output 会将信息放入管道中。从那里,它可以被管道传输到另一个命令中。如果输出到达一个没有将其输出管道传输到其他地方的命令,它将被存储到一个变量中(如果您以语句开始该行)$var =。如果此时不处理,输出将写入主机控制台。

$a = Write-Output "Test string"
# Console will be empty
# $a will contain Test string

$a = Write-Host "Test string" | Out-File "C:\output.txt"
# Console will be empty
# $a will be null, and output.txt will contain "Test String"

完整输出流参考: https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/30/understanding-streams-redirection-and-write-host-in-powershell/

答案2

在 PowerShell 中,您可以使用GetType()来获取对象的类型。因此,只需将命令的结果放入变量中并GetType()对其使用:

[PS] C:\Users\username\Desktop> $x = New-MoveRequest ... -WhatIf
[PS] C:\Users\username\Desktop> $x.GetType()
You cannot call a method on a null-valued expression.
At line:1 char:11
+ $x.GetType <<<< ()
    + CategoryInfo          : InvalidOperation: (GetType:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

结果:-WhatIf在 cmdlet 上使用参数会导致null

要捕获命令的所有输出(包括WhatIf-Output),您可以使用Start-Transcript

[PS] C:\Users\username\Desktop> Start-Transcript tmpfile
[PS] C:\Users\username\Desktop> New-MoveRequest ... -WhatIf
[PS] C:\Users\username\Desktop> Stop-Transcript

这将捕获所有输出并将其写入 tmpfile,尽管还带有许多意外的附加信息:

[PS] C:\Users\username\Desktop> Get-Content tmpfile
**********************
Windows PowerShell Transcript Start
Start time: 20170510090649
Username  : username
Machine   : hostname (Microsoft Windows NT 6.1.7601 Service Pack 1)
**********************
Transcript started, output file is x
[PS] C:\Users\username\Desktop>$x = New-MoveRequest ... -WhatIf
What if: ...
[PS] C:\Users\username\Desktop>Stop-Transcript
**********************
Windows PowerShell Transcript End
End time: 20170510090701
**********************

我还没有找到删除所有冗长内容的方法,因此您必须再次解析此文件。

答案3

您无法使用“-whatif”参数解决问题。正如一些评论者所指出的,这只能从开关、命令和对象的角度验证命令是否正确。

例如,New-MoveRequest testusername -TargetDatabase databasename -WhatIf 仅在用户名不存在或数据库“databasename”不存在时才会出错。这非常适合确保您没有拼写错误。即使邮箱存在导致失败的严重问题,这也会传递 -WhatIf。

如果您在实际移动请求时遇到问题,请发布您收到的错误。

一个常规故障排除注意事项是,如果移动失败,您可以使用 Get-MoveRequestStatistics 获取更多详细信息并查看以下属性:

  • 失败代码
  • 故障类型
  • 失败方
  • 信息

相关内容