2016-03-30 16 views
0

Ich versuche, Powershell zu verwenden, um große Protokolldateien in separate Dateien aufzuteilen, damit ich sie anzeigen kann. Ich habe Code online gefunden, um mich zu starten, und ich habe ihn jetzt an meine Bedürfnisse angepasst. Das Problem, das ich habe, ist, dass ich möchte, dass das Skript in einem anderen Ordner als der Protokolldatei gespeichert wird, aber die geteilten Dateien im selben Ordner wie die Protokolldatei erstellt werden. Derzeit teilt es die Protokolldateien in demselben Ordner auf, in dem sich das Skript befindet. Ich habe versucht, die Datei set-location(split-path $filename -parent -resolve) zu ändern, die das Verzeichnis in den Ordner ändert, in dem sich die Protokolldatei befindet, aber die geteilten Protokolldateien immer noch in den Ordner spuckt, in dem sich das Skript befindet. Jede Hilfe wird sehr geschätzt werden Vielen Dank.Protokolldateien im selben Ordner wie Protokolldatei teilen

#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

See [meine Antwort] (http://stackoverflow.com/a/32379304/4424236) für diese Frage: [Split-Text Datei in kleinere Dateien basierend auf Größe (Windows)] (http://stackoverflow.com/questions/32360801/split-text-file-into-smaller-files-based-on-size-windows). – beatcracker

Antwort

1

die .NET-Methoden (wie zum Beispiel File.CreateText()), löst Teilpfade relativ zum Arbeitsverzeichnis des Prozesses läuft, anstatt die Powerspezifische Stelle durch Set-Location eingestellt.

Erstellen Sie einen absoluten Pfad mit Join-Path und dass stattdessen CreateText() passieren:

$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

Vielen Dank für die Erklärung, wie .NET-Methoden den Pfad auflösen, der hilfreich war und Ihr Code wie vorgesehen funktioniert hat. Vielen Dank. – themackyo

Verwandte Themen