3

まず、私は PowerShell を学んでいますが、多くのスクリプト言語でプログラミングを行ってきました。

リモートサーバー上のコマンドから出力を取得し、その出力に「実行中」という単語があるかどうかを確認するスクリプトを作成しています。現在、コマンドの出力を取得しており、変数$data. 問題は、「clean_data」関数を介してそれを入れていることであり、関数に渡す変数の内容と同じではありません。

私が疑問に思っているのは、$data変数の出力が画面に出力されたときに一体どのように1つのコンテンツを持つのかということですが、関数に渡されてすぐに出力されたときに新しいコンテンツが表示されるのですか? 私は何が欠けていますか?

返された行をループして、「実行中」の行がいくつあるかを確認し、そうでない場合は適切なエラーを出力したいだけです。

CODE (部分: 関数と関連コード)

function clean_data($input) {
  Write-Output "Received data"$input
  Write-Output "Cleaning data"
  $output=@()
  foreach ($line in $input) {
     Write-Output "Looking at: "$line.ToString()
     if ($line.ToString().Contains("running")) {
         $output+=$line
     }
   }
   Write-Output $output
   return ,$output
}

$data = Get-Job -id $jobid.id | Receive-Job
Write-output "Data Type: "$data.GetType().Fullname
Write-Output "Output of $cmd"
Write-Output "============================================================"
Write-Output $data
Write-Output "============================================================"
clean_data $data
Write-Output $newdata
Remove-Job -Id $jobid.Id

出力

Data Type:
System.Object[]
Output of C:\opcragt.bat servername
============================================================

C:\Windows\system32>"D:\Program Files\HP\HP BTO Software\bin\win64\opcragt.cmd" servername


Node: servername
HPOM Managed Node status:
-------------------------
OV Performance Core coda (3500) is running
OV Communication Broker ovbbccb (10988) is running
OV Control ovcd (10400) is running
OV Config and Deploy ovconfd (5092) is running

Subagent EA:
Action Agent opcacta (9716) is running
Monitor Agent opcmona (9872) is running
Message Agent opcmsga (14712) is running
Message Interceptor opcmsgi (13512) is running
WMI Interceptor opcwbemi (6608) is running

**************************************************
Remote administration completed successfully on all nodes.

============================================================
Received data
Current
-------
Cleaning data
4

1 に答える 1

7

$inputは、関数に渡されたデータの反復を許可するために PowerShell によって使用される自動変数です。代わりにこれを試してください:

function clean_data($data) {
  Write-Verbose "Received data: $data"
  Write-Verbose "Cleaning data"
  $output = @()
  foreach ($line in $data) {
     Write-Verbose "Processing line: $line"
     if ($line -match 'running') {
          $output += $line
     }
   }
   $output
}
于 2012-10-23T21:12:52.203 に答える