I had a huge 550 MB file, I wanted to split it into 55 or so files of 10 MB each.

The one improvement I would make to this next time is to make the suffix a 3 digit number so when the files sort by name they would be in numerical order (currently _1 and _10 sort together, _2 and _20 and so on).

cls
$ErrorActionPreference = "Stop"
$upperBound = 10MB # calculated by Powershell
$ext = "log"
$rootName = "c:\ProgramData\ssh\logs\sshd_log_Split_"

$reader = new-object System.IO.StreamReader("c:\ProgramData\ssh\logs\sshd_Archive.log")
$count = 1
$fileName = "{0}{1}.{2}" -f ($rootName, $count, $ext)
while(($line = $reader.ReadLine()) -ne $null)
{
    Add-Content -path $fileName -value $line
    if((Get-ChildItem -path $fileName).Length -ge $upperBound)
    {
        ++$count
        $fileName = "{0}{1}.{2}" -f ($rootName, $count, $ext)
    }
}

$reader.Close()

The above is based some minor modifications to a sample found here: https://stackoverflow.com/questions/1001776/how-can-i-split-a-text-file-using-powershell

Filed under: Powershell