为什么我无法使外部脚本在新窗口中运行?

时间:2019-04-30 22:15:25

标签: powershell

我构建了一个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;}

})

1 个答案:

答案 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
相关问题