【发布时间】:2015-06-27 21:08:16
【问题描述】:
发生了一些奇怪的事情,所以我要将我的 real 代码与 PowerShell 脚本一起粘贴(这可能很糟糕,但是嘿......)
import-module hyper-v
$vms = get-vm | select name
$allvms = @()
function getRAM
{
param([string]$vmname )
$ram = get-vm -name $vmname | select -ExpandProperty memorystartup
return $ram
}
function getState
{
param([string]$vmname )
$state = get-vm -name $vmname | select -ExpandProperty state
return $state
}
function getUptime
{
param([string]$vmname )
$uptime = get-vm -name $vmname | select -ExpandProperty uptime
return $uptime
}
function getCPUS
{
param([string]$vmname )
$cpus = get-vmprocessor -vmname $vmname | select -ExpandProperty count
return $cpus
}
foreach ($vm in $vms)
{
$tempvm = New-Object PSObject
Add-Member -InputObject $tempvm -MemberType NoteProperty -Name cpus -Value ""
Add-Member -InputObject $tempvm -MemberType NoteProperty -Name state -Value ""
Add-Member -InputObject $tempvm -MemberType NoteProperty -Name name -Value $vm.name
Add-Member -InputObject $tempvm -MemberType NoteProperty -Name ram -Value ""
Add-Member -InputObject $tempvm -MemberType NoteProperty -Name uptime -Value ""
$tempvm.ram = getRAM($vm.name)
$tempvm.state = getState($vm.name)
$tempvm.cpus = getCPUS($vm.name)
$tempvm.uptime = getUptime($vm.name)
$allvms += $tempvm
}
$allvms | export-csv c:/users/my_username/appdata/local/temp/vmi.csv -NoTypeInformation
从 elevated PowerShell 运行此程序会创建 CSV 文件,该文件可以使用此 Python 代码进行解析。
def _parseCSV(self):
pwd = os.getcwd()
os.chdir(tempfile.gettempdir())
print 'currently in dir', os.getcwd()
try:
csvfile = open('vmi.csv', 'r')
reader = csv.reader(csvfile)
print type(reader), reader
for row in reader:
print row
os.chdir(pwd)
print 'currently in dir', pwd
except Exception as ex:
raise ex
finally:
csvfile.close()
使用常规 PowerShell 运行它会产生一个空文件,这可能是 Hyper-V 模块的错误。
一个理想的场景是我的 Python 代码执行上面的 PowerShell 脚本,该脚本写入一个 CSV,稍后由相同的 Python 脚本解析......除了从 Python 以管理员身份运行 PowerShell 很棘手,所以我正在使用这个
def _runPowershell(self):
sp.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
'-ExecutionPolicy',
'Unrestricted',
'Start-Process',
'powershell',
'-WindowStyle Hidden',
'-verb',
'runas',
'-argumentlist',
'"-file '+self.PSPath+'"'])
#self.PSPath is c:/users/my_username/appdata/local/temp/vmi.ps1
我的 Python 脚本无法解析这个怪物生成的 CSV 文件。
CSV 输出
"cpus","state","name","ram","uptime"
"1","Running","vm1","268435456","00:35:46"
"2","Off","vm2","536870912","00:00:00"
【问题讨论】:
-
如果 PowerShell 与这个问题相关,我会很好奇文件中的第一行是您的标题还是类型行。不管你的 CSV 看起来是否正确?
-
能否将
print str(ex)更改为raise ex并包含回溯? -
你确定这些行没有被执行吗?仅仅因为它没有打印您期望的内容并不意味着它们没有被执行。使用调试器或一些打印语句来确保这些行没有被执行。
-
csv.reader在文件中返回什么?vmi.csv文件是否在这些目录之一中? -
感谢大家的关注,我已经更新了我的问题并回答了您的问题。
标签: python parsing powershell csv