1 #!powershell 2 3 # Copyright: (c) 2017, Dag Wieers (@dagwieers) <dag@wieers.com> 4 # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 5 6 #AnsibleRequires -CSharpUtil Ansible.Basic 7 #Requires -Module Ansible.ModuleUtils.ArgvParser 8 #Requires -Module Ansible.ModuleUtils.CommandUtil 9 10 $spec = @{ 11 options = @{ 12 include_volumes = @{ type='list' } 13 exclude_volumes = @{ type='list' } 14 freespace_consolidation = @{ type='bool'; default=$false } 15 priority = @{ type='str'; default='low'; choices=@( 'low', 'normal') } 16 parallel = @{ type='bool'; default=$false } 17 } 18 supports_check_mode = $true 19 } 20 21 $module = [Ansible.Basic.AnsibleModule]::Create($args, $spec) 22 23 $include_volumes = $module.Params.include_volumes 24 $exclude_volumes = $module.Params.exclude_volumes 25 $freespace_consolidation = $module.Params.freespace_consolidation 26 $priority = $module.Params.priority 27 $parallel = $module.Params.parallel 28 29 $module.Result.changed = $false 30 31 $executable = "defrag.exe" 32 33 if (-not (Get-Command -Name $executable -ErrorAction SilentlyContinue)) { 34 $module.FailJson("Command '$executable' not found in $env:PATH.") 35 } 36 37 $arguments = @() 38 39 if ($include_volumes) { 40 foreach ($volume in $include_volumes) { 41 if ($volume.Length -eq 1) { 42 $arguments += "$($volume):" 43 } else { 44 $arguments += $volume 45 } 46 } 47 } else { 48 $arguments += "/C" 49 } 50 51 if ($exclude_volumes) { 52 $arguments += "/E" 53 foreach ($volume in $exclude_volumes) { 54 if ($volume.Length -eq 1) { 55 $arguments += "$($volume):" 56 } else { 57 $arguments += $volume 58 } 59 } 60 } 61 62 if ($module.CheckMode) { 63 $arguments += "/A" 64 } elseif ($freespace_consolidation) { 65 $arguments += "/X" 66 } 67 68 if ($priority -eq "normal") { 69 $arguments += "/H" 70 } 71 72 if ($parallel) { 73 $arguments += "/M" 74 } 75 76 $arguments += "/V" 77 78 $argument_string = Argv-ToString -arguments $arguments 79 80 $start_datetime = [DateTime]::UtcNow 81 $module.Result.cmd = "$executable $argument_string" 82 83 $command_result = Run-Command -command "$executable $argument_string" 84 85 $end_datetime = [DateTime]::UtcNow 86 87 $module.Result.stdout = $command_result.stdout 88 $module.Result.stderr = $command_result.stderr 89 $module.Result.rc = $command_result.rc 90 91 $module.Result.start = $start_datetime.ToString("yyyy-MM-dd hh:mm:ss.ffffff") 92 $module.Result.end = $end_datetime.ToString("yyyy-MM-dd hh:mm:ss.ffffff") 93 $module.Result.delta = $($end_datetime - $start_datetime).ToString("h\:mm\:ss\.ffffff") 94 95 $module.Result.changed = $true 96 97 $module.ExitJson() 98