我构建了一个Powershell表单,该表单可以从Azure中的快照重新创建VM。我有支持脚本,可以完成实际的准备工作,并且在运行时可以正常运行。但是,当我从生成表单的脚本中执行它时,它要么无法运行,要么相对早地卡在文件中,并且无法完成所有命令的执行。我可以在运行时验证参数是否正确,因为表单上的按钮之一调用了一个验证所有参数的脚本。
由于其中一个下标一直处于执行状态,因此我想在新窗口中打开它并使其完成。但是我尝试做的所有事情:
不运行脚本
打开一个新窗口,但不执行任何操作
打开,然后立即关闭脚本(我在运行的第二秒钟看不到红色文本)。由于总执行时间通常为10分钟,因此我知道它要么崩溃要么就大怒了。
我还注意到,当我从一个表单中运行azureRM命令时,如果我尝试执行两个以上的命令来执行某项操作,则无论我是否在ISE中打开它或从中运行,它都会立即冻结脚本。 CLI。在下面的片段中,这是我单击按钮以重新动画化/重新创建VM时要尝试运行的内容。您会看到我已经注释了很多尝试使其独立运行。
$reanimateButton.add_Click({
$mySub = ""
if($RadioButton1.Checked){$mySub = '$subscriptionA'}
if($RadioButton2.Checked){$mySub = '$subscriptionB'}
$rgName = $rgMenu.Text
$vm = $vmNameMenu.Text
$sa = $storageMenu.text
$oSnap = $snapOSMenu.Text
$dSnap = $snapDataMenu.Text
$opSnap = $snapOptionalMenu.Text
$vmSize = $vmSizeMenu.Text
$argumentList = "-subscription $mySub -resourceGroupName $rgName -vmName $vm -diagStorageAcc $sa -snapshotName $oSnap -DataSnapshotName $dSnap -optionalDataSnapName $opSnap -vmSize $vmSize"
$scriptPath = "C:\azure\vm scripting\Reanimator\Restore-vmFromSnapshot.ps1"
#cd "C:\azure\vm scripting\Reanimator"
#.\Restore-vmFromSnapshot.ps1 -subscription $mySub -resourceGroupName $rgName -vmName $vm -diagStorageAcc $sa -snapshotName $oSnap -DataSnapshotName $dSnap -optionalDataSnapName $opSnap -vmSize $vmSize
#Invoke-expression 'cmd /c start powershell -Command {"& `"$scriptPath`" $argumentList"}'
#Invoke-Expression "& `"$scriptPath`" $argumentList"
cmd /c start powershell -Command {"& `"$scriptPath`" $argumentList"}
#start-process powershell -ArgumentList -NoExit -Command {cd "C:\azure\vm scripting\Reanimator"; .\Restore-vmFromSnapshot.ps1 -subscription $mySub -resourceGroupName $rgName -vmName $vm -diagStorageAcc $sa -snapshotName $oSnap -DataSnapshotName $dSnap -optionalDataSnapName $opSnap -vmSize $vmSize;}
})
答案 0 :(得分:0)
请勿使用Invoke-Expression
。
要在新窗口中启动PowerShell脚本或命令,请使用Start-Process
。您的尝试没有奏效的原因很可能是PowerShell将-NoExit
和-Command
解释为Start-Process
的参数(不存在),而不是新变量的参数。 PowerShell进程。您需要将参数作为单个字符串传递
Start-Process 'powershell.exe' -ArgumentList "-NoExit -Command {...}"
或作为数组,其中应将-NoExit
之类的参数定义为字符串。
Start-Process 'powershell.exe' -ArgumentList '-NoExit', '-Command', "{...}"
话虽如此,您的陈述过于混乱。更好(更简单)的方法是通过相应的Start-Process
参数设置工作目录,然后通过-File
运行脚本。
$workdir = 'C:\azure\vm scripting\Reanimator'
$params = '-NoExit', '-File', '.\Restore-vmFromSnapshot.ps1',
'-subscription', $mySub, '-resourceGroupName', $rgName,
'-vmName', $vm, '-diagStorageAcc', $sa, '-snapshotName', $oSnap,
'-DataSnapshotName', $dSnap, '-optionalDataSnapName', $opSnap,
'-vmSize', $vmSize
Start-Process 'powershell.exe' -WorkingDirectory $workdir -ArgumentList $params