【问题标题】:Define variable to be used in the batch script定义要在批处理脚本中使用的变量
【发布时间】:2018-06-17 02:03:12
【问题描述】:

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

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

通过 PS 使用上述内容将安装该服务,因为它只是启动 .bat 文件。该服务需要JAVA_HOME,它已经设置为环境系统变量,但 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 文件。

【问题讨论】:

  • $env:JAVA_HOME,但如果它已经设置好了,“puppet 不知道它已经设置好了”和“将它输入 .bat 文件”是什么意思?如果设置好了,那就设置好了,Puppet 还是没有 Puppet,对吧?如果 .bat 文件不是为接受输入而构建的,你就不能给它输入,对吧?
  • 在 PowerShell 中,使用命令 & cmd.exe /C SET 查看调用 .bat 脚本时可用的变量。
  • 您应该能够通过exec 资源直接运行批处理文件。我看不到 PowerShell 会在这里发挥作用。
  • @TessellatingHeckler 我不能,因为 Puppet 不知道,因为 Puppet 无权检索环境系统变量!根据我的阅读,我需要将它定义为 puppet 中的 FACT,这样它才能工作。但是,我不想在多个地方定义这个变量,因为将来如果路径发生变化,事情可能会中断!
  • @AnsgarWiechers 真的,我能做到!但是,它有什么不同呢?它仍然没有解决我对不知道 JAVA_HOME 的 puppet 的问题

标签: powershell batch-file cmd


【解决方案1】:

您可以将批处理和 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 扩展名),然后尝试在 cmd 或 PowerShell 主机中启动 mybatch.cmd a b c。希望这会有所帮助。

【讨论】:

  • 不要使用类似的弗兰肯脚本。它们是维护和调试的主要痛苦,从你那里继承其中之一的人会在他们的余生中恨你。
  • @AnsgarWiechers,我不同意这种观点,因为继承代码的人应该了解他自己(或她自己)选择的工作,这就是为什么有可能面对任何类型的代码.
  • @KatePage 你可以随意不同意所有你喜欢的。继承这种可憎的东西并不比 PITA 少。
  • @KatePage - 我几乎没有看到人们可以选择他们继承的代码。不,暂时想不到。
【解决方案2】:

我可能会创建一个自定义事实来解析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,
}

注意:我现在不能测试这个,所以我不能完全确定批处理脚本是否可以像那样直接运行(不过我希望它会这样)。如果它不只是将行更改为

command => 'cmd.exe /c "graylog-collector-service.bat install GrayLogCollector"',

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2022-06-30
    • 2011-02-10
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多