Module: Mixlib::ShellOut::Windows::Utils

Defined in:
lib/mixlib/shellout/windows.rb

Class Method Summary collapse

Class Method Details

.find_executable(path) ⇒ Object

Windows has a different notion of what “executable” means The OS will search through valid the extensions and look for a binary there.



308
309
310
311
312
313
314
315
316
# File 'lib/mixlib/shellout/windows.rb', line 308

def self.find_executable(path)
  return path if File.executable? path

  pathext.each do |ext|
    exe = "#{path}#{ext}"
    return exe if File.executable? exe
  end
  return nil
end

.pathextObject



291
292
293
# File 'lib/mixlib/shellout/windows.rb', line 291

def self.pathext
  @pathext ||= ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') + [''] : ['']
end

.should_run_under_cmd?(command) ⇒ Boolean

api: semi-private If there are special characters parsable by cmd.exe (such as file redirection), then this method should return true.

This parser is based on github.com/ruby/ruby/blob/9073db5cb1d3173aff62be5b48d00f0fb2890991/win32/win32.c#L1437

Returns:

  • (Boolean)


257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/mixlib/shellout/windows.rb', line 257

def self.should_run_under_cmd?(command)
  return true if command =~ /^@/

  quote = nil
  env = false
  env_first_char = false

  command.dup.each_char do |c|
    case c
    when "'", '"'
      if (!quote)
        quote = c
      elsif quote == c
        quote = nil
      end
      next
    when '>', '<', '|', '&', "\n"
      return true unless quote
    when '%'
      return true if env
      env = env_first_char = true
      next
    else
      next unless env
      if env_first_char
        env_first_char = false
        env = false and next if c !~ /[A-Za-z_]/
      end
      env = false if c !~ /[A-Za-z1-9_]/
    end
  end
  return false
end

.which(cmd) ⇒ Object

which() mimicks the Unix which command FIXME: it is not working



297
298
299
300
301
302
303
# File 'lib/mixlib/shellout/windows.rb', line 297

def self.which(cmd)
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
    exe = find_executable("#{path}/#{cmd}")
    return exe if exe
  end
  return nil
end