How can i get the amount of free space (numerical value) in a logical disk drive in windows server 2012 R2

1,682 views
Skip to first unread message

ishan jain

unread,
Jul 13, 2016, 7:06:44 AM7/13/16
to Ansible Project
I am trying very hard to get a numerical value of free disk space on a windows server 2012 R2 machine, but couldn't get it so far. All the commands that are available for listing the disk space information - they are not providing the output in proper format. Here are a few commands i tried:

raw: Get-PSDrive C | Select-Object Free

Output:

TASK [debug] *******************************************************************
ok: [AC05] => {
    "freeSpace": {
        "changed": false,
        "rc": 0,
        "stderr": "",
        "stdout": "\r\n                                                                           Free\r\n                                                                           ----\r\n                                                                    53051551744\r\n\r\n\r\n",
        "stdout_lines": [
            "",
            "                                                                           Free",
            "                                                                           ----",
            "                                                                    53051551744",
            "",
            ""
        ]
    }
}


raw: fsutil volume diskfree C: | find /i "avail free bytes"

output:

TASK [debug] *******************************************************************
ok: [AC05] => {
    "drive": {
        "changed": false,
        "rc": 0,
        "stderr": "",
        "stdout": "Total # of avail free bytes  : 53056536576\r\n",
        "stdout_lines": [
            "Total # of avail free bytes  : 53056536576"
        ]
    }
}

wmic logicaldisk get size

output: (no way of getting info for single drive)

Size

63899168768

53683941376


------------------


As you can see, there really doesn't seems to be a way of knowing the exact numerical value of free disk space in windows machine. Anybody doing this without using any external utility ?

J Hawkesworth

unread,
Jul 13, 2016, 8:31:11 AM7/13/16
to Ansible Project
Try something like this:

Get-PsDrive C |select-object Free|ConvertTo-json

You should then be able to use 'register' to capture the result and make use of it.

By the way I found this which has a lot of good starting points for converting unix toolbox commands into powershell  https://www.gitbook.com/book/devopscollective/a-unix-person-s-guide-to-powershell/details

Hope this helps,

Jon

ishan jain

unread,
Jul 14, 2016, 2:27:10 AM7/14/16
to Ansible Project
Thanks Jon, this solved my issue. I didn't know about this convertto-Json thing and it seems to be very useful. The only problem is the raw module which would still require lot of string operations to find the desired value.

Using "Get-PsDrive C |select-object Free|ConvertTo-json", i get the value in Ansible like this:

TASK [debug] *******************************************************************
ok: [AC05] => {
    "drive | to_json": {
        "changed": false,
        "rc": 0,
        "stderr": "",
        "stdout": "{\r\n    \"Free\":  38710173696\r\n}\r\n",
        "stdout_lines": [
            "{",
            "    \"Free\":  38710173696",
            "}"
        ]
    }
}


This is still not very useful. So i used from_json to parse the output.

 - debug: var="(drive.stdout | from_json).Free"

and thus got the output in proper format:

TASK [debug] *******************************************************************
ok: [AC05] => {
    "(drive.stdout | from_json).Free": "38709694464"

J Hawkesworth

unread,
Jul 14, 2016, 3:57:16 PM7/14/16
to Ansible Project
Thanks for this, that's a nice trick.  I have a feeling there ought to be a simpler way of doing it but haven't thought what that might be yet.
Jon

bramm...@gmail.com

unread,
Jul 13, 2017, 1:59:59 PM7/13/17
to Ansible Project
Since the result is produced by a jinja2 statement, the representation is a string. You should still convert to an integer when using the result, ie in a "when condition".

I use something like this to only install a package when there's enough free disk space:

---
- hosts: winhosts
  name: Install {{ packagename }}
  gather_facts: false
  vars:
    packagename: name-of-the-package
    tempdir: C:\Windows\Temp\{{ packagename }}
    required_space: 20
  tasks:
  - name: execute powershell
    win_command:  powershell.exe "Get-PSDrive C | Select-Object Free | ConvertTo-Json"
    register: getpsdrive

  - name: Register freediskspace as a fact
    set_fact:
      freediskspace: "{{ (getpsdrive.stdout | from_json).Free // 1073741824 }}"

  - block: 
    - name: Create a temporary directory
      ...
    - name: Copy stuff to the temporary directory
      ...
    - name: 'Install {{ packagename }}'
      ...
    - name: 'Remove {{ packagename }} install files'
      ...
     
    when:
    - freediskspace | int > required_space


Bests,

Bram



Op donderdag 14 juli 2016 21:57:16 UTC+2 schreef J Hawkesworth:
Reply all
Reply to author
Forward
0 new messages