Search code examples
powershellif-statementfilesize

Powershell IF ELSE based on File Size


Trying to find a way in powershell that allowed me to move a file based on its size. I could not find exactly what I was looking for. I found how to move files of only a certain size and to do other if/then statements but not to move a file to different locations based on there size.

Why did I need/want to do this? A exe I am running creates and output even if it has no data. so sometimes the file is empty and sometimes it has data. When it has data I need it sent to someone, when its empty I just wanted it in a backup folder for reference.

This part let me move a file based on size: -cle is less than or equal to

$BlankFiles = Get-ChildItem c:\test\*.rej | where { $_.Length -cle 0kb}

This part let me check if an empty file exist: After lots of reading went with system.io.file over test-path

[System.IO.File]::Exists($BlankFiles)

Putting this all in a IF/ELSE statement was the problem i struggled with. Answer I came up with is below.

I am mainly posting this since I could not find the exact scenario and if any one sees a problem with this approach that I missed.


Solution

  • Here is the solution I came up with and it all the test I did it appears to be working as intended. Note: I only need to do this on one file at a time, which is why this works and why I left out recursive or loop steps.

    If the file is blank it moves it to a backup folder and appends it with the date, if it has data it makes a copy with the date append to the backup folder and moves the file with date append to a different location that is accessible to the necessary users.

    I was thinking about going with check to see how many lines are in the file over the size of the file, but it appears the file when blank sometimes has a return in it and sometimes it doesn't. So I went with size method instead

    $BlankFiles = Get-ChildItem c:\test\*.rej | where { $_.Length -cle 0kb}
    
    $date = Get-Date
    $fndate = $date.ToString("MMddyyyy")
    
    If ([System.IO.File]::Exists($BlankFiles) -eq "True") {
    Move-Item C:\test\*.rej c:\test\blankfiles -"$fndate".rej
    }
    Else {
    Copy-Item c:\test\*.rej c:\test\realfiles-"$fndate".rej
    Move-Item c:\test\*.rej c:\user\accessible\realfiles-"$fndate".rej -Force
    }
    

    If anyone see any issues with doing this way or has a better suggestions, but as I mentioned from my test it appears to be working wonderfully and I thought I would share.