2014-09-24 5 views
0

나는 stackoverflow에 새로운 오전과 나는 정말로 powershell 균열 아니에요. 어쩌면 당신은 내 문제를 도와 줄 수 있습니다. 모니터링을 위해 리눅스 서버에서 "vmstat 1 10"의 ssh 결과를 얻고 싶습니다. 내가 가진 10 가지 가치의 평균 가치를 얻어야합니다. 내 계획은 객체의 전체 값을 얻을 수 있었다 그래서 등 swpd, 무료, 버프, 같은 값의 평균을 얻기 위해배열/객체에서 내 값을 변환하려면 어떻게 변환합니까?

procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------ 
r b swpd free buff cache si so bi bo in cs us sy id wa st 
1 0 42352 599980 315860 2488096 0 0 2606 794 5 2 3 0 94 2 0 
0 0 42352 600044 315860 2488096 0 0 64 84 1107 2107 0 1 99 1 0 
0 0 42352 596820 315860 2488096 0 0 280  4 1218 2179 7 1 91 2 0 
0 0 42352 589240 315860 2488096 0 0 32  7 1322 2366 1 1 95 3 0 
0 0 42352 588620 315860 2488096 0 0 144 37 1161 2181 1 0 96 3 0 
0 0 42352 588620 315860 2488096 0 0  0 24 1074 2075 0 0 100 0 0 
0 0 42352 588620 315860 2488096 0 0  0  0 1081 2081 0 1 100 0 0 
0 0 42352 588628 315860 2488096 0 0 128 32 1133 2091 1 0 96 3 0 
0 0 42352 588652 315860 2488100 0 0  0  0 1077 2058 0 0 100 0 0 
0 0 42352 588528 315860 2488100 0 0  0  5 1137 2147 0 0 99 0 0 

후합니다 결과 "1 10 vmstat를"A 보통은 다음과 같습니다 $tab.swpd | Measure-Object -avg과 비슷하지만 오류가 발생합니다.

여기 내 개체의 값을 가져 오는 스크립트입니다. (나는 이것이 아주 좋은 아니라는 것을 알고있다 - 그 미안 난 아직 ... 배우는 중이에요.) :

내가 배열 또는 개체에서 원하는처럼 모든 것을 내 값이 너무 후
$runs = 10 
#Get the Values via plink (putty) 
$vmstat = .\plink.exe -ssh [email protected] -batch -pw "PASSWORD-YES-I-KNOW-THIS-IS-BAD" vmstat 1 $runs 
$vmstat 
########################## 
#Get the Values in somthing like a csv 
$vmstat = $vmstat.replace(" ", ";") 
#replace alle double ";;" with single ";" 
while ($vmstat -match ";;"){ 
    $vmstat = $vmstat.replace(";;", ";") 
    } 

#Delete ";" at the beginning (and at the end. Just to be sure. normally there arent ";" 's) 
$vmstat = $vmstat.Trim(";") 
#Save Columnames 
$tabhead = $vmstat[1].split(";") 
#Delete first and second row 
$vmstat = $vmstat[2..($runs+1)] 

########################## 
#Split Values and Store it in an two-dimensional array 
$values = New-Object system.Array[][] $tabhead.Length, $runs 

for ($i=0;$i -lt ($vmstat.Length); $i++){ 
    $tmp = $vmstat[$i].split(";") 

    for ($j=0;$j -lt ($tmp.Length); $j++){ 
     $values[$j][$i] = $tmp[$j] 
     } 
} 

########################## 
# Make an Object for Measurement! 
$tab = New-Object System.Object 

for ($i=0;$i -lt $tabhead.Length; $i++){ 
    $tab | Add-Member -type NoteProperty -name $tabhead[$i] -Value $values[$i] 
} 

. 내가보고 싶은 값을 선택 할 수 있어요 :

PS C:\> $tab 

r  : {1, 0, 0, 0...} 
b  : {0, 0, 0, 0...} 
swpd : {42352, 42352, 42352, 42352...} 
free : {599980, 600044, 596820, 589240...} 
buff : {315860, 315860, 315860, 315860...} 
cache : {2488096, 2488096, 2488096, 2488096...} 
si : {0, 0, 0, 0...} 
so : {0, 0, 0, 0...} 
bi : {2606, 64, 280, 32...} 
bo : {794, 84, 4, 7...} 
in : {5, 1107, 1218, 1322...} 
cs : {2, 2107, 2179, 2366...} 
us : {3, 0, 7, 1...} 
sy : {0, 1, 1, 1...} 
id : {94, 99, 91, 95...} 
wa : {2, 1, 2, 3...} 
st : {0, 0, 0, 0...} 

PS C:\> $tab.in 
5 
1107 
1218 
1322 
1161 
1074 
1081 
1133 
1077 
1137 

을하지만 난 뭔가를해야만 등에하려고하면 $tab.swpd | Measure-Object -Average 나는 다음과 같은 오류 얻을 :

Measure-Object : Das Eingabeobjekt "System.Object[]" ist nicht numerisch. 
In Zeile:1 Zeichen:13 
+ $tab.swpd | Measure-Object -Average 
+    ~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidType: (System.Object[]:Object[]) [Measure-Object], PSInvalidOperationException 
    + FullyQualifiedErrorId : NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand 

나는 심지어 개체를 필요로하지 것이라고 생각을, 나는 또한 $values[0] | Measure-Object -Average 같은 것을 할 수 있어야한다고 생각하지만 같은 오류가 있습니다. 문제는 값이 int 값이 아님을 안다. 그러나 나는 그들을 측정 할 수 있도록 그들을 변환하는 방법을 모른다.

답변

-1

동일한 리소스에 대한 액세스 권한이 없으므로 문제를 완벽하게 재현 할 수 없었습니다. 당신 말이 맞아요. Measure-Object은 숫자가 아닌 값으로는 작동하지 않는다고 알려줍니다. PowerShell의 최신 버전이이 기능을 더 잘 처리 할 수 ​​있다고 생각하지만, 캐스트가 잘 할 것입니다. 효율성

당신은 세미콜론 빈 공간을 분할하고 하나가 될 때까지 사람들을 cosolidating하는 경우 System.Int32[]

System.Object[] 배열을 캐스팅해야

[int[]]($tab.swpd) | Measure-Object -Average 

. 정규식 그 전체 루프를 저장할 수 있습니다. 이렇게하면 공백 그룹을 가져 와서 세미콜론으로 변환합니다. 그러면 결국 문제를 해결할 수 있습니다. 이것은 여러분이 Measure-Object와 관련된 문제를 해결할 수 있습니다. 그 이유는 여러분이 그 밖의 다른 것을 추가하지 않는다고 가정 할 때 모든 공백을 제거해야하기 때문입니다. 당신은 이미 당신이 이미하는 것처럼 이것으로 생성 된 선행 및 후미 세미콜론을 처리해야합니다. 의견

에서

$vmstat = $vmstat.replace("\s+", ";") 

편집 그래서 캐스트가 실패를 참조하십시오. 처음에는 알지 못했던 배열 값에 공백이 있습니다. 아마도 이것이 당신이 가지고 있고 문제를 제기하는 이유입니다. 문자열 배열이 있습니다. 나는 당신의 코드를 다시 살펴보고 이들이 어디에서 오는지 알아낼 것이다. 이 문제를 해결할 수있는 다른 방법이 있지만 코드 하단에이 줄을 업데이트하는 간단한 방법이있을 수 있습니다.

+0

답장을 보내 주셔서 감사하지만 작동하지 않는 것 같습니다. (그리고 전 버전 3에서 Powershell을 사용하고 있습니다.) : System.Object [] "System.Object"[System.Object "]"System.Int32 "매개 변수가 변경되었습니다. Zeile : 1 Zeichen : 1 + [int []] ($ tab.swpd) | 측정 - 개체 - 평균 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo : InvalidArgument : (:) [], RuntimeException + FullyQualifiedErrorId : ConvertToFinalInvalidCastException' – frupfrup

+0

업데이트보기 @frupfrup – Matt

+0

작동합니다! 이제'$ tab.XXX | 측정 - 개체 - 평균 '. 효율성에 대한 감사와 감사의 말을 전합니다. 내가 처음에 말했듯이 나는 여전히 파워 쉘 프로가 아니다. 그러나 너를 통해 나는 다시 무언가를 배웠다! – frupfrup