# File lib/chef/provider/powershell_script.rb, line 63 def flags default_flags = [ "-NoLogo", "-NonInteractive", "-NoProfile", "-ExecutionPolicy RemoteSigned", # Powershell will hang if STDIN is redirected # http://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected "-InputFormat None", # Must use -File rather than -Command to launch the script # file created by the base class that contains the script # code -- otherwise, powershell.exe does not propagate the # error status of a failed Windows process that ran at the # end of the script, it gets changed to '1'. "-File" ] interpreter_flags = default_flags.join(' ') if ! (@new_resource.flags.nil?) interpreter_flags = [@new_resource.flags, interpreter_flags].join(' ') end interpreter_flags end
Process exit codes are strange with PowerShell. Unless you explicitly call exit in Powershell, the powershell.exe interpreter returns only 0 for success or 1 for failure. Since we’d like to get specific exit codes from executable tools run with Powershell, we do some work using the automatic variables $? and $LASTEXITCODE to return the process exit code of the last process run in the script if it is the last command executed, otherwise 0 or 1 based on whether $? is set to true (success, where we return 0) or false (where we return 1).
# File lib/chef/provider/powershell_script.rb, line 39 def normalize_script_exit_status( code ) target_code = ( EXIT_STATUS_EXCEPTION_HANDLER + EXIT_STATUS_RESET_SCRIPT + "\n" + code.to_s + EXIT_STATUS_NORMALIZATION_SCRIPT ) convert_boolean_return = @new_resource.convert_boolean_return @code = new-variable -name interpolatedexitcode -visibility private -value $#{convert_boolean_return}new-variable -name chefscriptresult -visibility private$chefscriptresult = {#{target_code}}.invokereturnasis()if ($interpolatedexitcode -and $chefscriptresult.gettype().name -eq 'boolean') { exit [int32](!$chefscriptresult) } else { exit 0 } end
Generated with the Darkfish Rdoc Generator 2.