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

Powershell 定义要在批处理脚本中使用的变量,powershell,batch-file,cmd,Powershell,Batch File,Cmd,我有一个安装服务的批处理脚本。我正在使用puppet在windows上使用Powershell安装此服务 C:\graylog-collector\bin\graylog-collector-service.bat install GrayLogCollector 通过PS使用上述服务,只需启动.bat文件即可安装该服务。此服务需要JAVA\u HOME,它已经设置为一个env系统变量,但Puppet不知道这一点。在运行此批处理文件之前,我试图传递JAVA\u HOME的值。我尝试了几种不同

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

C:\graylog-collector\bin\graylog-collector-service.bat install GrayLogCollector 
通过PS使用上述服务,只需启动.bat文件即可安装该服务。此服务需要
JAVA\u HOME
,它已经设置为一个env系统变量,但Puppet不知道这一点。在运行此批处理文件之前,我试图传递
JAVA\u HOME
的值。我尝试了几种不同的方法,例如:

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

我不想编辑文件,也不想再次声明变量。我正在尝试使用系统中已设置的内容。基本上,尝试获取JAVA_HOME的值并将其输入.bat文件。

您可以将批处理脚本和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:

“PowerShell args…$($args.ForEach{$\u0})”
获取ChildItem环境:

将其保存为批处理脚本(.bat或.cmd扩展名),然后尝试将
mybatch.cmd a b c
启动到cmd或PowerShell主机中。希望这有帮助。

我可能会创建一个自定义事实来解析
JAVA\u HOME
环境变量:

Facter.add(:java\u home)do
setcode do
环境[“爪哇之家”]
结束
结束
或者(如果未设置环境变量,则查找
java
二进制文件的回退会更加复杂):

Facter.add(:java\u home)do
setcode do
开始
ENV['JAVA_HOME']| File.dirname(File.dirname(`readlink-f$(which JAVA)2>/dev/null`.chomp))
营救
无
结束
结束
结束
Facter.add(:java_home)do
限制:osfamily=>“Windows”
setcode do
开始
ENV['JAVA_HOME']| File.dirname(File.dirname(`where java2>num`.lines[0].chomp))
营救
无
结束
结束
结束
将文件命名为
java_home.rb
,并将其放置在一个文件夹中。我们通常将这些事实放在应用程序配置文件模块的
lib/facter

然后,您可以使用该事实修改
exec
资源的环境:

exec{'Install GraylogCollector service':
命令=>'graylog-collector-service.bat安装GrayLogCollector',
除非=>“sc查询GraylogCollector”,
path=>['C:\Windows','C:\Windows\system32','C:\graylog collector\bin'],
环境=>[“JAVA_HOME=${::JAVA_HOME}],
logoutput=>true,
}
NB:我现在无法测试这一点,所以我不能完全确定批处理脚本是否可以像那样直接运行(不过我希望它可以)。如果它不只是将行更改为

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

$env:JAVA_HOME
,但是如果它已经设置好了,“puppet不知道它已经设置好了”和“将它输入到.bat文件中”是什么意思?如果是设定的,就是设定的,木偶还是没有木偶,对吗?如果.bat文件不是为获取输入而构建的,则无法为其提供输入,对吗?在PowerShell中,使用命令
&cmd.exe/C SET
查看调用.bat脚本时哪些变量可用。您应该能够通过
exec
资源直接运行批处理文件。我看不到PowerShell将在这里发挥作用。@TessellingEckler我看不到,因为Puppet不知道,因为Puppet无权检索环境系统变量!根据我所读到的,我需要将它定义为傀儡中的一个事实,这样它就会起作用。但是,我不想在多个地方定义这个变量,因为将来如果路径发生变化,事情可能会破裂@真的,我能做到!但是,这又有什么不同呢?它仍然不能解决我对木偶不了解JAVA的问题。不要使用像这样的弗兰肯斯脚本。维护和调试这些代码是一件非常痛苦的事情,从您那里继承其中一个代码的人会恨您一辈子。@AnsgarWiechers,我不同意这种观点,因为继承代码的人应该理解他自己(或她自己)选择了什么工作这就是为什么有可能面对任何类型的代码。@KatePage您可以随心所欲地提出异议。这并不意味着继承这样一个令人讨厌的东西比PITA少多少。@KatePage-我发现人们几乎没有选择继承什么代码的选项。不,现在想不起来了。