gpt4 book ai didi

python-3.x - 在python脚本中运行powershell脚本

转载 作者:行者123 更新时间:2023-12-03 01:27:43 29 4
gpt4 key购买 nike

我正在尝试在python脚本中运行Powershell脚本。
我的想法是做类似的事情:

#pythonscript.py


def windowsupdate():

#Somehow call all of this powershell code within the file

Write-Host("Installing module PSWindowsUpdate if not already installed... ")
Install-Module PSWindowsUpdate
Write-Host("PSWindowsUpdate is now installed.")
Write-Host("")
Write-Host("Getting Windows Updates...")
Import-Module PSWindowsUpdate
$updates = Invoke-Command -ScriptBlock {Get-Wulist -verbose}
$updatenumber = ($updates.kb).count
if ($null -ne $updates){
Get-WindowsUpdate -AcceptAll -Install | Out-File C:\PSWindowsUpdate.log
do {$updatestatus = Get-Content c:\PSWindowsUpdate.log
"Currently processing the following update:"
Get-Content c:\PSWindowsUpdate.log | select-object -last 1
Start-Sleep -Seconds 10
$ErrorActionPreference = 'SilentlyContinue'
$installednumber = ([regex]::Matches($updatestatus, "Installed" )).count
$ErrorActionPreference = ‘Continue’
}until ( $installednumber -eq $updatenumber)
}
Remove-Item -path C:\PSWindowsUpdate.log


#call function
windowsupdate() #opens up a powershell window and goes through the code then when completed close


如果有任何方法可以执行与此类似的操作,而无需创建单独的Powershell文件,那将是最好的情况。如果不是这样,并且也需要将其保存在自己的文件中,并且如果需要这样,那么我将如何在python中调用该函数?

任何帮助是极大的赞赏!

最佳答案

我相信实现您想要做的事情的最简单方法是使用subprocess.Popen。该函数可以从python脚本中调用命令行/终端命令。可以这样使用:

import subprocess
subprocess.Popen()

命令放在两个方括号之间的位置。

可以使用命令行从命令行执行Powershell命令(请参阅 this):
powershell -command ""

您的命令在两个引号之间。
由于subprocess.Popen可以调用命令行命令,因此您可以通过它来调用powershell命令。这是使用第一个ps命令的示例:
import subprocess
command='Write-Host("Installing module PSWindowsUpdate if not already installed...")'
subprocess.Popen('powershell -command '+"'"+command+"'")

或者,您可以使用subprocess.run执行命令。 subprocess.run执行命令然后脚本继续执行的唯一区别是subprocess.Popen在脚本继续执行时运行命令。

如果您希望命令以静默方式执行操作(例如,无需打开powershell),请使用命令将 stdout=subprocess.PIPE, shell=True传递给 subprocess.Popen
您可以使用以下类似的方法直接打印输出:
stdout_value = process.communicate()[0]
print (stdout_value)

其中process是您的subprocess.Popen()对象。
现在完成所有命令:

如果要打印命令的输出,可以使用:
import subprocess
def call_command(command):
process=subprocess.Popen('powershell -command '+"'"+command+"'", stdin=subprocess.PIPE,stdout=subprocess.PIPE, shell=True)
stdout_value = process.communicate()[0]
return stdout_value

print(call_command('Write-Host("Installing module PSWindowsUpdate if not already installed... ")'))

只需对每个命令使用call_command即可完成。您将在输出中看到一些额外的字符(例如 \n\r),默认情况下,powershell会包含这些字符以实际创建换行符,等等。基本上,如果您不希望使用这些字符,则可以自己删除它们(例如。 string.replace('\n', ''))

如果您想实际打开powershell,则为每行调用 subprocess.Popen将为每行打开一个powershell终端,我认为您不希望这样做。我将花更多的技巧在一个powershell终端中调用所有命令:

您可以做的一件事是将powershell命令放在扩展名为.ps1的文件中,然后可以使用subprocess.Popen调用它并在powershell终端中完全运行它。
例如:
import subprocess
subprocess.Popen("C://path/to/your/file/myfile.ps1")

但是您必须拥有另一个文件,而不仅仅是Python脚本。

要么:

您可以将所有命令合并为一个:
commands = """ Write-Host("Installing module PSWindowsUpdate if not already installed... ")
Install-Module PSWindowsUpdate
Write-Host("PSWindowsUpdate is now installed.")
Write-Host("")
Write-Host("Getting Windows Updates...")
Import-Module PSWindowsUpdate
$updates = Invoke-Command -ScriptBlock {Get-Wulist -verbose}
$updatenumber = ($updates.kb).count
if ($null -ne $updates){
Get-WindowsUpdate -AcceptAll -Install | Out-File C:\PSWindowsUpdate.log
do {$updatestatus = Get-Content c:\PSWindowsUpdate.log
"Currently processing the following update:"
Get-Content c:\PSWindowsUpdate.log | select-object -last 1
Start-Sleep -Seconds 10
$ErrorActionPreference = 'SilentlyContinue'
$installednumber = ([regex]::Matches($updatestatus, "Installed" )).count
$ErrorActionPreference = ‘Continue’
}until ( $installednumber -eq $updatenumber)
}
Remove-Item -path C:\PSWindowsUpdate.log"""

然后使用子进程运行它:
import subprocess;
subprocess.Popen(["powershell","& {" + command+ "}"])
# or subprocess.Popen('powershell -command' + command)

要在终端中打印它而不是打开powershell,请使用:
import subprocess;
subprocess.Popen(["powershell","& {" + command+ "}"], stdin=subprocess.PIPE,stdout=subprocess.PIPE, shell=True)
stdout_value = process.communicate()[0]
return stdout_value

就是这样!

关于python-3.x - 在python脚本中运行powershell脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61010311/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com