2013-06-26 3 views
0

PowerShell 코딩의 초보자로서 PowerShell 정규식 패턴에서 변수를 확장하는 데 어려움이 있습니다. 내가하고 싶었던 무엇정규식 패턴의 변수 확장이 작동하지 않습니다.

은 두 시간대 로그 파일 각각에 대해

  • 사이에 변경된 로그 파일에 대한

    • 스캔, 나는 그것이로 참조하는 날짜를 나타내는 이름의 일부를 얻을 .

    날짜가 변수 $filedate에 저장됩니다. 내가 보이는 라인을 찾을 때마다 다음 각 행 물마루 이동은 로그 파일 같은 : 나는 데이터 라인이 글은 출력을 작성해야

    2013-06-20 14:00:15 blablabla

    가되도록 할 blabla20130620.log 라는 이름의 파일에서

    14:00:15 blablabla

    다른 로그 파일을 연결하기 위해 텍스트 파일에 모드를 추가하십시오.

    여기까지가 지금입니다 (지금 샌드 박스에서 테스트 중이므로 아무런 코멘트가 없습니다 ...)

    $Logpath = "o:\Log" 
    $prevcheck="2013-06-24 19:27:14" 
    $currenttd="{0:yyyy-MM-dd HH:mm:ss}" -f (get-date) 
    $batch = 1000 
    [regex]$match_regex = '^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)' 
    If (Test-Path "$Logpath\test.txt"){ 
    Remove-Item "$Logpath\test.txt" 
    } 
    
    $files=Get-ChildItem $LogPath\*.log | Where-Object { $_.LastWriteTime -ge "$prevcheck" - and $_.LastWriteTime -le "$currenttd" -and !$_.PSIsContainer } 
    foreach ($file in $files) 
    { 
    $filedate=$file.Name.Substring(6,4) + "-" + $file.Name.Substring(10,2) + "-" + $file.Name.Substring(12,2) 
    
    ## This doesn't seem to work fine 
    ## results look like: 
    ## "$filedate" 14:00:15 blablabla 
    
    $replace_regex = '"$filedate" $_' 
    
    ## I tried this too, but without success 
    ## The time seems to dissappear now 
    ## results look like: 
    ## 2013-06-20 blablabla 
    
    #$replace_regex = iex('$filedate' + $_) 
    
    (Get-Content $file.PSPath -ReadCount $batch) | 
    foreach-object {if ($_ -match $match_regex) { $_ -replace $match_regex, $replace_regex}  else { $_ }}| 
    out-file -Append "o:\log\test.txt" 
    
  • 답변

    0

    지나치게 복잡합니다. 당신이 문자열로 참조 날짜를 변환 할 필요가 없습니다

    • 당신은 당신의 Where-Object 필터에 날짜를 비교하고 있습니다.그냥 날짜를 사용

      $prevcheck = Get-Date "2013-06-24 19:27:14" 
      $currenttd = Get-Date 
      
    • 당신은 파일 이름에서 날짜를 추출하고 원하는 형식으로 변환하는 정규 표현식을 사용할 수 있습니다

      $filedate = $file.BaseName -replace '^.*(\d{4})(\d{2})(\d{2})$', '$1-$2-$3' 
      
    • 시간을 일치에 대한 귀하의 정규 표현식은 지나치게 수정. 대신 ^(\d{2}:\d{2}:\d{2})을 사용하십시오. 조금 더 가벼워 보이지 만, 눈에 띄게 많을 것 같습니다.

    • 날짜와 시간을 앞에 붙이려면 "$filedate `$1"을 사용하십시오. 큰 따옴표로 인해 $filedate이 파일 이름의 날짜로 확장되고 이스케이프 처리 된 $ (``$ 1`)은 그룹화 된 일치를 유지합니다 (Richard의 설명 참조).

    • 각 단계의 결과를 변수에 할당 할 수 있지만 단일 파이프 라인을 사용하는 것이 더 쉽습니다.

    이 시도 : 아무것도 해결하지 않는 것

    $Logpath = "o:\Log" 
    $Logfile = "$Logpath\test.txt" 
    $prevcheck = Get-Date "2013-06-24 19:27:14" 
    $currenttd = Get-Date 
    
    If (Test-Path -LiteralPath $Logfile) { Remove-Item $Logfile } 
    
    Get-ChildItem "$LogPath\*.log" | ? { 
        -not $_.PSIsContainer -and 
        $_.LastWriteTime -ge $prevcheck -and 
        $_.LastWriteTime -le $currenttd 
    } | % { 
        $filedate = $_.BaseName -replace '^.*(\d{4})(\d{2})(\d{2})$', '$1-$2-$3' 
        Get-Content $_ | % { 
        $_ -replace '^(\d{2}:\d{2}:\d{2})', "$filedate `$1" 
        } | Out-File -Append $Logfile 
    } 
    
    +0

    와우 ... 고마워. 이제 좀 더 이해하려고 노력할 것입니다. – davidthijs

    1

    변수 치환을 위해서는 PowerShell 문자열을 큰 따옴표 (")로 묶어야합니다. 작은 따옴표 (') 문자열은 변수 대체를 수행하지 않습니다. 스크립트에서

    (있는 나는 당신이 따라 구조를 쉽게하기 위해 코드 블록의 내용을 들여 제안 없음) : 문자열이 하나의 인용

    $replace_regex = '"$filedate" $_' 
    

    , 그래서 변수를 대체합니다. 이것은 백 견적을 기억 해결할 수 있습니다 (`) 문자는 이중 인용 된 문자열에 포함 된 큰 따옴표 탈출하는 데 사용할 수 있습니다

    $replace_regex = "`"$filedate`" $_" 
    

    을하지만 기억 :

    • $은 정규식 메타입니다 문자이므로 $을 큰 따옴표로 묶은 정규식에 포함 시키려면 PSH가 변수 이름의 시작으로 처리되지 않도록 이스케이프 처리해야합니다.
    • 변수의 정규식 메타 문자는 정규식 의미를 갖습니다. 대체하기 전에 변수의 내용을 이스케이프하는 것이 좋습니다 ([regex]::Escape(string)).
    +0

    설명 주셔서 감사하지만 불행히도. 그것은 원래 줄을 변환합니다 : 17:02:33 ps2pdf 버전 2.0 28/02/2012 입력 : "2013-06-22"ps2pdf 버전 2.0 28/02/2012 $ replace_regex = 'THISISAPREFIX $ _'를 시도하면 끝납니다. 시간은 그대로두고 접두어가 붙은 문자열을 사용합니다. 다음은 결과입니다 : THISISAPREFIX 17:02:33 ps2pdf 버전 2.0 28/02/2012 ps2pdf 버전 2.0 28/02/2012이 경우에는 시간이 두 줄로 표시됩니다. 좋지도 않다 – davidthijs

    +0

    @davidthijs : 현재 코드에서 regex escape와 concaternation을 사용하여 대체 코드를 작성하지 않는 이유는 무엇입니까? 문자열 대체가 필요하지 않으므로 디버깅이 쉬워야합니다.'([regex] :: escape ($ filedate) + '$ 1')' – Richard

    관련 문제