Определите переменную, которая будет использоваться в пакетном скрипте

У меня есть пакетный скрипт, который устанавливает сервис. Я использую Puppet для установки этого сервиса на Windows, используя Powershell.

C:\graylog-collector\bin\graylog-collector-service.bat install GrayLogCollector 

Использование вышеупомянутого через PS установило бы службу как ее простой запуск файла.bat. Эта услуга требует JAVA_HOME которая уже установлена ​​как системная переменная env, но Puppet этого не знает. Я пытаюсь передать значение JAVA_HOME перед запуском этого командного файла. Я пробовал несколько разных вещей, например:

$JAVA_HOME = [Environment]::GetEnvironmentVariable("JAVA_HOME", "Machine"); C:\graylog-collector-0.5.0\bin\graylog-collector-service.bat install GrayLogCollector 

Я не хочу редактировать файл и не хочу объявлять переменную снова. Я пытаюсь использовать то, что уже установлено в системе. В основном, пытаясь получить значение JAVA_HOME и скормить его в файл.bat.

2 ответа

Вы можете объединить свои пакетные сценарии и сценарии PowerShell в один пакетный сценарий, чтобы выполнить свою работу. Например:

<# :
@echo off
  setlocal
    set "JAVA_HOME=..." % rem : this will be established in PowerShell too
    powershell /nologo /executionpolicy bypass^
    "&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
  endlocal
exit /b
#>
"PowerShell args...$($args.ForEach{$_})"
Get-ChildItem env:

Сохраните это как пакетный скрипт (расширение.bat или.cmd), затем попробуйте запустить mybatch.cmd a b c в cmd или хост PowerShell. Надеюсь это поможет.

Я бы, вероятно, создал пользовательский факт для разрешения JAVA_HOME переменная окружения:

Facter.add(:java_home) do
  setcode do
    ENV['JAVA_HOME']
  end
end

или (более сложный с отступлением для определения местоположения java двоичный файл, если переменная окружения не установлена):

Facter.add(:java_home) do
  setcode do
    begin
      ENV['JAVA_HOME'] || File.dirname(File.dirname(`readlink -f $(which java) 2>/dev/null`.chomp))
    rescue
      nil
    end
  end
end

Facter.add(:java_home) do
  confine :osfamily => 'Windows'
  setcode do
    begin
      ENV['JAVA_HOME'] || File.dirname(File.dirname(`where java 2>nul`.lines[0].chomp))
    rescue
      nil
    end
  end
end

Назовите файл java_home.rb и поместите его в правильный каталог. Мы обычно размещаем такие факты в lib/facter нашего модуля профилей приложений.

Затем вы можете использовать этот факт, чтобы изменить среду exec ресурс:

exec { 'Install GraylogCollector service':
  command     => 'graylog-collector-service.bat install GrayLogCollector',
  unless      => 'sc query GraylogCollector',
  path        => [ 'C:\Windows', 'C:\Windows\system32', 'C:\graylog-collector\bin' ],
  environment => [ "JAVA_HOME=${::java_home}" ],
  logoutput   => true,
}

NB: Я не могу проверить это прямо сейчас, поэтому я не совсем уверен, можно ли запустить пакетный сценарий напрямую (хотя я бы ожидал, что это произойдет). Если это не просто изменить строку на

command => 'cmd.exe /c "graylog-collector-service.bat install GrayLogCollector"',
Другие вопросы по тегам