在虚拟机上自动执行某些测试时,我遇到了 Powershell 的间歇性问题。
场景和设置如下:
运行 HyperV 的服务器
一台具有多个快照的虚拟机
恢复给定快照、复制文件、运行测试和检索日志文件
的 Powershell 脚本 使用不同参数多次调用 Powershell 脚本的批处理文件
批处理文件参数指定使用哪个快照、运行哪个测试等。
问题如下:
我可以运行批处理,并且某些测试将无法复制文件/无法创建计划任务/无法检索日志文件等。如果任何(或所有)部分失败,它会有所不同。一些测试将完全有效。如果我重新运行相同的批处理文件,一些测试可能会再次失败,而另一些会起作用;在哪个失败和哪个运行方面没有一致性。有时我有两个使用相同快照的相邻测试,1 个可以工作,1 个不能(请参阅下面的错误)。
为了恢复快照,我使用了“Hyper-V 的 PowerShell 管理库”,来自:( http://pshyperv.codeplex.com/releases )
下面是部分代码:
Powershell(减去一些函数/变量声明/读取 xml 配置文件/读取和验证命令行输入/和其他不相关的部分):
Function ApplySnapshot
{
LogAction "Starting apply snapshot"
LogAction $("Restoring snapshot {0}" -f $ss)
#Stop a running VM, restore snapshot, start it up and connect to it
$vmstate = get-vmstate $vmname
$vmstate = $vmstate.EnabledState
if ($vmstate -ne "Stopped")
{
stop-vm $vmname -force
Start-Sleep -Second 15
}
get-vmsnapshot $vmname | where {$_.ElementName -eq $ss} | Restore-VMSnapshot -force
start-vm $vmname -force
Start-Sleep -Second 20
LogAction $("Snapshot {0} restored" -f $ss)
LogAction "End apply snapshot"
}
Function CopyFiles
{
LogAction "Start copy installation files"
$from = "\\server\folderx"
$to = "\\" + $hostname + "\C$\test"
Enter-PSSession -ComputerName $hostname -Credential $cred
Copy-Item $from $to -Recurse
LogAction "End copy installation files"
}
Function CreateSchedule ($hn, $tn, $tr, $sd, $st, $un, $pw)
{
LogAction "Starting create schedule"
Invoke-Command -ComputerName $hn -ScriptBlock {
param($hn, $tn, $tr, $sd, $st, $un, $pw)
Write-Host $("Host name: [{0}]" -f $hn);
$cmd = $("schtasks.exe /create /S ""{0}"" /tn ""{1}"" /tr ""{2}"" /sc once /sd {3} /st {4} /ru ""{5}"" /rp ""{6}"" /rl highest /V1" -f $hn, $tn, $tr, $sd, $st, $un, $pw);
Invoke-Expression $cmd;
} -ArgumentList @($hn, $tn, $tr, $sd, $st, $un, $pw)
LogAction "End create schedule"
}
...setting variables etc...
ApplySnapshot
CopyFiles
CreateSchedule -hn $hostname -tn $taskname -tr $taskrun -sd $setdate -st $settime -un $username -pw $password
批处理文件:
PowerShell -Command "& C:\Auto.ps1" <...params...>
PowerShell -Command "& C:\Auto.ps1" <...params...>
PowerShell -Command "& C:\Auto.ps1" <...params...>
PowerShell -Command "& C:\Auto.ps1" <...params...>
pause
示例输出:
C:\Auto>PowerShell -Command "& C:\Auto.ps1" <...params...>
WARNING: The job to Change state of VM TestVM to Stopped is still
running in the background.
You can check its progress with Test-wmiJob or Test-wmiJob -statusOnly using
the following job id:
\\Server\root\virtualization:Msvm_ConcreteJob.InstanceID="A207CEBA-F582-4A42-
BCDE-3312C7FB6DCC"
JobStarted
WARNING: The job to Change state of VM TestVM to Running is still
running in the background.
You can check its progress with Test-wmiJob or Test-wmiJob -statusOnly using
the following job id:
\\Server\root\virtualization:Msvm_ConcreteJob.InstanceID="42C31CEF-00E2-40A7-
AF70-578B0B91B05D"
JobStarted
Enter-PSSession : Connecting to remote server failed with the following error m
essage : The WinRM client cannot complete the operation within the time specifi
ed. Check if the machine name is valid and is reachable over the network and fi
rewall exception for Windows Remote Management service is enabled. For more inf
ormation, see the about_Remote_Troubleshooting Help topic.
At C:\Auto.ps1:192 char:18
+ Enter-PSSession <<<< -ComputerName $hostname -Credential $cred
+ CategoryInfo : InvalidArgument: (TestVM:String) [Enter-PSS
ession], PSRemotingTransportException
+ FullyQualifiedErrorId : CreateRemoteRunspaceFailed
[TestVM] Connecting to remote server failed with the following error messa
ge : The WinRM client cannot complete the operation within the time specified.
Check if the machine name is valid and is reachable over the network and firewa
ll exception for Windows Remote Management service is enabled. For more informa
tion, see the about_Remote_Troubleshooting Help topic.
+ CategoryInfo : OpenError: (:) [], PSRemotingTransportException
+ FullyQualifiedErrorId : PSSessionStateBroken
因此,在此示例中,快照已成功应用(尽管有警告)。将文件复制到虚拟机后,会出现“Enter-PSSession”错误。
作为测试,我在另一台服务器上尝试了这个(也运行 HyperV 等),我发现我仍然收到初始错误(在文件复制阶段之后),但我没有收到创建计划任务的错误。
我所有努力搜索“连接到远程服务器失败并显示以下错误消息:WinRM 客户端无法在指定的时间内完成操作”的信息。错误似乎说“确保机器设置为远程使用”;好吧,我知道这是因为有时它可以工作,如果我只运行“Enter-PSSession”命令,我可以连接。
服务器和虚拟机在同一个域中。
我知道这里有很多东西需要考虑,但我真的很感谢在如何解决/解决这个问题方面提供一些帮助。
谢谢