2013-03-01 2 views
0

다음 스크립트가 작동하며보다 효율적인 방식으로 다시 작성하려고합니다. 다음 작업을 아래의 코드 라인은 내가 원하는 것을 달성 : 문자열을 변수로 바꾸기

Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern "/GPR" | % { 
    $_.Line -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2' 
} 

Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern "DV6" | % { 
    $_.Line -replace '(?:.*)(DV6)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2' 
} 

나는 약간 내가 무엇을 찾고 변경에 일곱 번 코드의 똑같은 라인을 반복합니다. 이 작동하는 동안 코드는 내가 결정하는 방법 뒤범벅이 정말 싫어,

/GPR,R3556 
/GPR,R3556 

: (:이 단지 작은 출력 주) 내가 얻을 출력은 내가 원하는 것 다음이다 보다 효과적인 방법으로 다시 쓰려고 노력합니다. 나는 다시 작성한 코드를 다음과 같이 :

$My_Arr = "/GPR", "DV6", "DV7", "RT3", "DEV", "TST", "PRE" 
$low = $My_Arr.getlowerbound(0) 
$upper = $My_Arr.getupperbound(0) 
for ($temp=$low; $temp -le $upper; $temp++){ 
    $Test = $My_Arr[$Temp] 
    Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern $My_Arr[$temp] | % { 
    $_.Line -replace '(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2' 
    } 
} 

이 나에게 준다 출력은 다음과 같은 : 내 오류가 발생하는 위치를

10   Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***. Size in bytes: 53704; pages printed: 2                 20130219123105.000000-300 
10   Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***. Size in bytes: 53700; pages printed: 2                 20130219123037.000000-300 

이 그러나 -replace 라인은 거의 정확 코드가 ($ Test)에 도달하면 변수 대신 문자열을 기다리고 있기 때문입니다. 이 예제에서 위의 원하는 출력 대신/GPR을 찾을 때마다 구문 분석하는 텍스트 파일의 전체 줄을 게시하고 있습니다. 누구든지이 줄을 고치고 내가 사용한 원래 코드와 같은 출력을 얻는 방법을 알고 있습니까?

EDIT : 최신 코드를 사용하고있는 결과물은 .txt 파일에있는 정확한 텍스트이기 때문에 구문 분석을 시도하고 있습니다. .txt에는 그보다 더 많은 행이 있지만 대부분은 그것과 동일합니다. 나는/GPR이나 배열에있는 다른 가능한 문자열을 얻고 그 다음에 "on"이라는 단어 뒤에 올 서버 이름을 얻는 것에 만 관심이있다.

+0

당신은 일치되고 있음을 원본 텍스트의 샘플을 게시 할 수 다음과 같이 , 따옴표로 대체하려고하지만, 두 번째 문자열에 간단한 따옴표를 유지? – mjolinor

+0

두 번째 코드 줄에서 얻은 출력은 정확하게 일치되는 원본 텍스트입니다. 죄송합니다, 더 명확하게 언급해야합니다. – Valrok

+0

"두 번째 코드 행"이 무슨 뜻인지 이해할 수 없습니다. 당신은 내가 가지고 있지 않은 파일로부터 입력을 읽고 있습니다 ..... – mjolinor

답변

1

나는 이것이 가변 확장을 막는 간단한 따옴표로 인해 발생한다고 말하고 싶습니다. PS가 $ test 변수를 그 값으로 바꾸지 않고 정확한 문자열 '(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)'을 바꾸려고합니다.

Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern $My_Arr[$temp] | % { 
    $_.Line -replace "(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)", '$1,$2' 
0

데이터에서 효과가 있습니까?

$file = 'C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt' 
$regex = '(?:.*)(/GPR|DV6|DV7|RT3|DEV|TST|PRE)(?:.*)(?<=on\s)(\w+)(?:.*)' 
(Get-Content $file) -match $regex -replace $regex,'$1,$2'