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
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
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”
}
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
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: