簡體   English   中英

將 PowerShell output 轉換為 Python 並將其存儲在變量中

[英]Convert PowerShell output to Python and store it in variable

提前抱歉愚蠢的問題。

我正在嘗試編寫使用 PowerShell 命令運行虛擬機的簡單 python 腳本。

我在將 output 從 PowerShell 命令轉換為 Python 中的變量時遇到了一點問題。

這個想法是:

我啟動虛擬機,然后檢查它的 state,如果 state 正在運行 - 啟動所有活動。

在 PowerShell 中執行它不是問題,我編寫了所有命令(啟動 VM,檢查 state,if 語句等),但是從 py 文件執行它是一個問題。

我的腳本如下所示:

import subprocess
import time
import os


class Utils(object):
    def __init__(self):
        self.ps_exec = r"C:\path\PsExec.exe"
        self.power_shell = r"C:\path\powershell.exe"

    def vm(self, apply_vm_script):
        subprocess.Popen([self.power_shell, apply_vm_script])

util = Utils()

def turn_on_vm(vm_name, checkpoint_name):
    apply_vm_script = 'Invoke-Command -Computername name -ScriptBlock ' \
                           '{ Get-VM ''"' + vm_name + '"'' | get-vmsnapshot -Name ' + '"' + checkpoint_name + '" | ' \
                           'Restore-VMSnapshot -Confirm:$false ; Start-VM -Name ''"' + vm_name + '"''}'
    util.vm(apply_vm_script)
    time.sleep(10)
    
def check_if_vm_on(vm_name):
    check_vm_script = 'Invoke-Command -Computername name -ScriptBlock { Get-VM | where {$_.Name -eq ' + vm_name + ' } | where { $_.State -eq "Running" } | select Name,State}'
    util.vm(check_vm_script)
    time.sleep(3)
    
def test():    
    turn_on_vm('VM_name', 'checkpoint_name')
    if(check_if_vm_on('VM_name')):
        Do my activity
    
def main():
    test()
    
if __name__ == '__main__':
    main()

此外,我可以在 PowerShell 中執行所有 if 操作,但也無法將 bool output 轉換為 Python:

if($State -like '*Running*') { Write-Output "True" }

State 前面已經定義好了,變量沒問題。

任何想法如何解決它?

先感謝您!!!

您需要從 powershell 腳本獲取標准輸出到您的 python 程序。 這可以通過Popen.communicate()來完成。

def vm(self, apply_vm_script):
        p = subprocess.Popen([self.power_shell, apply_vm_script], stdout=subprocess.PIPE)
        result = p.communicate()[0]
        return str(result)

您還需要從check_if_vm_on返回此值

def check_if_vm_on(vm_name):
    check_vm_script = 'Invoke-Command -Computername name -ScriptBlock { Get-VM | where {$_.Name -eq ' + vm_name + ' } | where { $_.State -eq "Running" } | select Name,State}'
    result = util.vm(check_vm_script)
    time.sleep(3)
    return result

然后您將能夠使用 if 語句檢查它:

if(check_if_vm_on('VM_name') == "True"):
    Do my activity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM