我正在尝试查找新 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"
答案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 获取更多详细信息并查看以下属性:
- 失败代码
- 故障类型
- 失败方
- 信息