2016-03-30 22 views
0

Büyük günlük dosyalarını ayrı dosyalara ayırmak için powershell kullanmaya çalışıyorum, böylece onları görüntüleyebilirim. Başlamak için çevrimiçi bir kod buldum ve şimdi ihtiyaçlarımı düzeltmek için değiştirdim. Sahip olduğum sorun, komut dosyasının log dosyasından ayrı bir klasörde olmasını, ancak bölünmüş dosyaların log dosyasıyla aynı klasörde oluşturulmasını istiyorum. Şu anda günlük dosyalarını betik içerisindeki aynı klasöre böler. set-location(split-path $filename -parent -resolve)'u çalıştırmayı denedim; bu dizin, günlük dosyasının bulunduğu klasöre değiştirir ancak yine de bölünmüş günlük dosyalarını betiğin bulunduğu klasöre dağıtır. Herhangi bir yardım büyük takdir edilecektir Teşekkürler.Günlük dosyası ile aynı klasördeki bölme günlük dosyaları

#split test 
param (
[string] $filename = $null 
) 
$sw = new-object System.Diagnostics.Stopwatch 
$sw.Start() 
$rootName = [io.path]::GetFileNameWithoutExtension($filename) 
$ext = [io.path]::GetExtension($filename) 
$linesperFile = 100000#100k 
$filecount = 1 
$reader = $null 
Set-Location(split-path $filename -parent -resolve) 
try{ 
$reader = [io.file]::OpenText($filename) 
try{ 
    "Creating file number $filecount" 
    $writer = [io.file]::CreateText("{0}-{1}{2}" -f ($rootName,$filecount.ToString("000"),$ext)) 
    $filecount++ 
    $linecount = 0 

    while($reader.EndOfStream -ne $true) { 
     "Reading $linesperFile" 
     while(($linecount -lt $linesperFile) -and ($reader.EndOfStream -ne $true)){ 
      $writer.WriteLine($reader.ReadLine()); 
      $linecount++ 
     } 

     if($reader.EndOfStream -ne $true) { 
      "Closing file" 
      $writer.Dispose(); 

      "Creating file number $filecount" 
      $writer = [io.file]::CreateText("{0}-{1}{2}" -f ($rootName,$filecount.ToString("000"),$ext)) 
      $filecount++ 
      $linecount = 0 
     } 
    } 
} finally { 
    $writer.Dispose(); 
} 
} finally { 
$reader.Dispose(); 
} 
$sw.Stop() 

Write-Host "Split complete in " $sw.Elapsed.TotalSeconds "seconds" 
+0

bakınız [cevabım] (http://stackoverflow.com/a/32379304/4424236) bu soru için: [bölünmüş metin Join-Path ile mutlak bir yol oluşturun ve yerine CreateText() o geçmesi

boyutu (windows) temel alan daha küçük dosyalara dosya ekleyin (http://stackoverflow.com/questions/32360801/split-text-file-into-smaller-files-based-on-size-windows). – beatcracker

cevap

1

NET yöntemlere (örneğin File.CreateText()) yerine Set-Location tarafından belirlenen PowerShell özel bir konuma daha işlem çalışan Çalışma dizini göre kısmi yolları giderir.

$newFileName = '{0}-{1}{2}' -f ($rootName,$filecount.ToString("000"),$ext) 
$fullPath = Join-Path -Path (Split-Path $filename -Parent) -ChildPath $newFileName 
$writer  = [IO.File]::CreateText($fullPath) 
+0

.NET yöntemlerinin yardımcı olduğu yolu nasıl çözdüğüne ve kodunuzun amaçlandığı şekilde çalıştığına dair açıklama için teşekkür ederiz. Teşekkürler. – themackyo

İlgili konular