2016-03-30 1 views
0

Я пытаюсь использовать powershell, чтобы разделить огромные файлы журналов на отдельные файлы, чтобы я мог их просматривать. Я нашел код в Интернете, чтобы начать работу, и я изменил его в соответствии со своими потребностями, теперь я просто его настраиваю. Проблема, которую я имею, - это то, что я хотел бы, чтобы сценарий был в отдельной папке, кроме файла журнала, но был создан разделенный файл в той же папке, что и файл журнала. В настоящее время он разбивает файлы журналов в той же папке, в которой находится скрипт. Я попытался сделать set-location(split-path $filename -parent -resolve), который меняет каталог на папку, в которой находится файл журнала, но все же выплевывает файлы разделенных журналов в папку, где находится скрипт. Любая помощь будет принята с благодарностью. Спасибо.разделяет файлы журналов в той же папке, что и файл журнала

#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

См [мой ответ] (http://stackoverflow.com/a/32379304/4424236) на этот вопрос: [раздвоение текст файл в файлы меньшего размера на основе размера (окна)] (http://stackoverflow.com/questions/32360801/split-text-file-into-smaller-files-based-on-size-windows). – beatcracker

ответ

1

Метода .NET (как, например, File.CreateText()), устраняет частичные пути относительно рабочего каталога процесса хода, а не PowerShell-определенного места, установленного Set-Location.

Создать абсолютный путь с Join-Path и передать в CreateText() вместо:

$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 решают путь, который был полезен, и ваш код работал по назначению. Спасибо. – themackyo

Смежные вопросы