定义要在批处理脚本中使用的变量

时间:2018-06-17 02:03:13

标签: powershell batch-file cmd

我有一个安装服务的批处理脚本。我正在使用puppet使用Powershell在Windows上安装此服务。

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 个答案:

答案 0 :(得分:0)

您可以将批处理和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主机中。希望这会有所帮助。

答案 1 :(得分:0)

我可能会创建一个解决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并将其放在proper directory中。我们通常将此类事实放在我们的应用程序配置文件模块的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"',