2017-12-22 6 views
0

PowerShell Scriptからさらに処理するために、さまざまなシステムメトリックをPythonに取り込もうとしています。私が必要とするデータを選んでエコーを使用して、それをPythonで読み込もうとしているtxtファイルに配置しましたが、Pythonデータを見るとちょっとばかげています。 Powershellはtxtファイルに出力するときに奇妙なエンコーディングを使用しますか?もしそうなら、PowerShellがPowerShellの形式を読むためにPythonが読むことができるか、または指示する形式でPowerShellを出力する方法がありますか?PowerShellのテキストをPythonに読み込んで出力する

PowerShellのコードは次のようになります。

$Make = Get-CimInstance CIM_ComputerSystem | Select Manufacturer 
echo $Make.manufacturer > c:\Mike\Output\SysConfig.txt 
$Model = Get-CimInstance CIM_ComputerSystem | Select Model 
echo $Model.model >> c:\Mike\Output\SysConfig.txt 
$Os = Get-CimInstance Win32_OperatingSystem | Select-Object Caption 
echo $Os.caption >> c:\Mike\Output\SysConfig.txt 
$CPU = Get-WmiObject Win32_Processor | Select * 
echo $CPU.Name >> c:\Mike\Output\SysConfig.txt 
echo $CPU.NumberOfCores >> c:\Mike\Output\SysConfig.txt 
echo $CPU.NumberOfLogicalProcessors >> c:\Mike\Output\SysConfig.txt 
echo $CPU.ThreadCount >> c:\Mike\Output\SysConfig.txt 
echo $CPU.MaxClockSpeed >> c:\Mike\Output\SysConfig.txt 
echo $CPU.CurrentClockSpeed >> c:\Mike\Output\SysConfig.txt 

テキスト出力は次のようになります。

Hewlett-Packard 
HP EliteBook 2570p 
Microsoft Windows 10 Pro 
Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz 
2 
4 
4 
2901 
2901 

とPythonのコードは次のようになります。

with open('c:\mike\output\SysConfig.txt', mode='r') as f: 
    Manufacturer = f.readlines(1) 
    Make = f.readlines(2) 
    OS = f.readlines(3) 
    CPU_Name = f.readlines(4) 
    CPU_Phys_Cores = f.readlines(5) 
    CPU_Log_Cores = f.readlines(6) 
    CPU_Threads = f.readlines(7) 
    CPU_Max_Clock = f.readlines(8) 
    CPU_Curr_Clock = f.readlines(9) 

print(Manufacturer) 
print(Make) 
print(OS) 
print(CPU_Name) 
print(CPU_Phys_Cores) 
print(CPU_Log_Cores) 
print(CPU_Threads) 
print(CPU_Max_Clock) 
print(CPU_Curr_Clock) 
+0

使用 '| Out-File -FilePath C:\ Mike \ Output \ SysConfig.txt -Encoding UTF8 -Append'、リダイレクト演算子 '>>'ではありません。また、すでにPowerShellを使用しているときにPythonを使用するポイントは何ですか? – TheIncorrigible1

+0

私はpowershellで動かすことができないが、Pythonは私のマシン上で信頼できるシステムメトリクスを生成しないことがわかっているはるかに大きなプログラムを作成しています。 –

+0

あなたは['readlines()'](https://docs.python.org/3/library/io.html#io.IOBase.readlines)を間違って使用しています。引数は、読み込む行の最大数** **を示します。これは、ファイル内の行のインデックスではありません。代わりに['readline()'](https://docs.python.org/3/library/io.html#io.IOBase.readline)を使用し、どこにでも 'f.readline()'を置くことをお勧めします。 – martineau

答えて

2

あなたの問題がありますリダイレクト演算子のエンコーディングはUnicode(UTF16-LE)です。

$CS = Get-CimInstance -ClassName CIM_ComputerSystem 
$OS = (Get-CimInstance -ClassName Win32_OperatingSystem).Caption 
$CPU = Get-CimInstance -ClassName Win32_Processor 

"{0}`n{1}`n{2}`n{3}`n{4}`n{5}`n{6}`n{7}`n{8}" -f @($CS.Manufacturer 
                $CS.Model 
                $OS 
                $CPU.Name 
                $CPU.NumberOfCores 
                $CPU.NumberOfLogicalProcessors 
                $CPU.ThreadCount 
                $CPU.MaxClockSpeed 
                $CPU.CurrentClockSpeed 
               ) | 
    Out-File -FilePath C:\Mike\Output\SysConfig.txt -Encoding UTF8 
1

問題ありませんあなたはPythonで持っているもの読み:クリーンアップ

$CS = Get-CimInstance -ClassName CIM_ComputerSystem 
$OS = (Get-CimInstance -ClassName Win32_OperatingSystem).Caption 
$CPU = Get-CimInstance -ClassName Win32_Processor 

@" 
$($CS.Manufacturer) 
$($CS.Model) 
$OS 
$($CPU.Name) 
$($CPU.NumberOfCores) 
$($CPU.NumberOfLogicalProcessors) 
$($CPU.ThreadCount) 
$($CPU.MaxClockSpeed) 
$($CPU.CurrentClockSpeed) 
"@ | Out-File -FilePath C:\Mike\Output\SysConfig.txt -Encoding UTF8 

いくつかのラベルを定義して、出力の提示に使用します。入力ファイル全体をバイト配列として読み込み、バイトを適切にデコードして文字列を作成し、存在する場合は行末を破棄します。行末で文字列を分割し、結果の各文字列を適切なラベルで印刷します。

vars = ["Manufacturer", "Make", "OS", "CPU_Name", "CPU_Phys_Cores", "CPU_Log_Cores", "CPU_Threads", "CPU_Max_Clock", "CPU_Curr_Clock"] 

with open('SysConfig.txt', 'rb') as f: 
    content = f.read().decode(encoding='UTF16').rstrip() 

for var, line in zip(vars, content.split('\n')): 
    print (var, line.strip()) 

出力:

Manufacturer Hewlett-Packard 
Make HP Compaq Elite 8300 SFF 
OS Microsoft Windows 10 Pro 
CPU_Name Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz 
CPU_Phys_Cores 4 
CPU_Log_Cores 4 
CPU_Threads 4 
CPU_Max_Clock 3201 
CPU_Curr_Clock 2700 
関連する問題