From fb953c16b8f8fbb3dbb146f8fb3b8510e63eeb35 Mon Sep 17 00:00:00 2001 From: James Truher Date: Thu, 7 Jul 2016 11:20:17 -0700 Subject: [PATCH 1/3] fix for Get-PSDrive to get free and used space on Non-Windows systems --- .../engine/Types_Ps1Xml.generated.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs b/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs index 88fbb7b61..07d05eca6 100644 --- a/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs +++ b/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs @@ -52,18 +52,30 @@ namespace System.Management.Automation.Runspaces if($this.Provider.ImplementingType -eq [Microsoft.PowerShell.Commands.FileSystemProvider]) { + if ( ! $IsWindows ) { + $filesystem,$size,$used,$available,$UsePerc,$mount = /bin/df -B 1 | ?{ $_.split()[-1] -eq $this.Root } | %{ $_.split(' ',([stringsplitoptions]'RemoveEmptyEntries')) } + $used + } + else { $driveRoot = ([System.IO.DirectoryInfo] $this.Root).Name.Replace('\','') $drive = Get-CimInstance Win32_LogicalDisk -Filter ""DeviceId='$driveRoot'"" $drive.Size - $drive.FreeSpace + } }"), null)); td4.Members.Add("Free", new ScriptPropertyData(@"Free", GetScriptBlock(@"## Ensure that this is a FileSystem drive if($this.Provider.ImplementingType -eq [Microsoft.PowerShell.Commands.FileSystemProvider]) { + if ( ! $IsWindows ) { + $filesystem,$size,$used,$available,$UsePerc,$mount = /bin/df -B 1 | ?{ $_.split()[-1] -eq $this.Root } | %{ $_.split(' ',([stringsplitoptions]'RemoveEmptyEntries')) } + $available + } + else { $driveRoot = ([System.IO.DirectoryInfo] $this.Root).Root.Name.Replace('\','') $drive = Get-CimInstance Win32_LogicalDisk -Filter ""DeviceId='$driveRoot'"" $drive.FreeSpace + } }"), null)); yield return td4; From 9597a4768997e51da1e621306ffefa1a95918c07 Mon Sep 17 00:00:00 2001 From: James Truher Date: Thu, 7 Jul 2016 17:24:27 -0700 Subject: [PATCH 2/3] change linux diskfree calculations from using /bin/df as a source of data to [io.driveinfo] --- .../engine/Types_Ps1Xml.generated.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs b/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs index 07d05eca6..12335c6cf 100644 --- a/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs +++ b/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs @@ -53,8 +53,8 @@ namespace System.Management.Automation.Runspaces [Microsoft.PowerShell.Commands.FileSystemProvider]) { if ( ! $IsWindows ) { - $filesystem,$size,$used,$available,$UsePerc,$mount = /bin/df -B 1 | ?{ $_.split()[-1] -eq $this.Root } | %{ $_.split(' ',([stringsplitoptions]'RemoveEmptyEntries')) } - $used + $driveInfo = ([System.IO.DriveInfo]::GetDrives()|where-object {$_.Name -eq $this.Root}|Select-Object -first 1) + $driveInfo.TotalSize - $driveInfo.AvailableFreeSpace } else { $driveRoot = ([System.IO.DirectoryInfo] $this.Root).Name.Replace('\','') @@ -68,8 +68,7 @@ namespace System.Management.Automation.Runspaces [Microsoft.PowerShell.Commands.FileSystemProvider]) { if ( ! $IsWindows ) { - $filesystem,$size,$used,$available,$UsePerc,$mount = /bin/df -B 1 | ?{ $_.split()[-1] -eq $this.Root } | %{ $_.split(' ',([stringsplitoptions]'RemoveEmptyEntries')) } - $available + ([System.IO.DriveInfo]::GetDrives()|where-object {$_.Name -eq $this.Root}|Select-Object -first 1).AvailableFreeSpace } else { $driveRoot = ([System.IO.DirectoryInfo] $this.Root).Root.Name.Replace('\','') From 1bbdaa7ea8a4327cf110bae077c6d3867f3f37e7 Mon Sep 17 00:00:00 2001 From: James Truher Date: Tue, 2 Aug 2016 15:50:02 -0700 Subject: [PATCH 3/3] Change free/used calculation to be consistent across platforms add a couple of tests to validate return values --- .../engine/Types_Ps1Xml.generated.cs | 20 +++---------------- .../Get-PSDrive.Tests.ps1 | 8 ++++++++ 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs b/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs index 12335c6cf..9e4e330af 100644 --- a/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs +++ b/src/System.Management.Automation/engine/Types_Ps1Xml.generated.cs @@ -52,29 +52,15 @@ namespace System.Management.Automation.Runspaces if($this.Provider.ImplementingType -eq [Microsoft.PowerShell.Commands.FileSystemProvider]) { - if ( ! $IsWindows ) { - $driveInfo = ([System.IO.DriveInfo]::GetDrives()|where-object {$_.Name -eq $this.Root}|Select-Object -first 1) - $driveInfo.TotalSize - $driveInfo.AvailableFreeSpace - } - else { - $driveRoot = ([System.IO.DirectoryInfo] $this.Root).Name.Replace('\','') - $drive = Get-CimInstance Win32_LogicalDisk -Filter ""DeviceId='$driveRoot'"" - $drive.Size - $drive.FreeSpace - } + $driveInfo = [System.IO.DriveInfo]::New($this.Root) + if ( $driveInfo.IsReady ) { $driveInfo.TotalSize - $driveInfo.AvailableFreeSpace } }"), null)); td4.Members.Add("Free", new ScriptPropertyData(@"Free", GetScriptBlock(@"## Ensure that this is a FileSystem drive if($this.Provider.ImplementingType -eq [Microsoft.PowerShell.Commands.FileSystemProvider]) { - if ( ! $IsWindows ) { - ([System.IO.DriveInfo]::GetDrives()|where-object {$_.Name -eq $this.Root}|Select-Object -first 1).AvailableFreeSpace - } - else { - $driveRoot = ([System.IO.DirectoryInfo] $this.Root).Root.Name.Replace('\','') - $drive = Get-CimInstance Win32_LogicalDisk -Filter ""DeviceId='$driveRoot'"" - $drive.FreeSpace - } + [System.IO.DriveInfo]::New($this.Root).AvailableFreeSpace }"), null)); yield return td4; diff --git a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSDrive.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSDrive.Tests.ps1 index 3fe0b272c..75c9d2ac0 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSDrive.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Management/Get-PSDrive.Tests.ps1 @@ -44,4 +44,12 @@ Describe "Get-PSDrive" -Tags "CI" { !(Get-PSDrive fake -ErrorAction SilentlyContinue) | Should Be $True Get-PSDrive fake -ErrorAction SilentlyContinue | Should BeNullOrEmpty } + It "Should be able to determine the amount of free space of a drive" { + $dInfo = Get-PSDrive TESTDRIVE + $dInfo.Free -ge 0 | Should be $true + } + It "Should be able to determine the amount of Used space of a drive" { + $dInfo = Get-PSDrive TESTDRIVE + $dInfo.Used -ge 0 | Should be $true + } }