在PowerShell脚本中扩展为Java生成的脚本类路径时出错

在PowerShell脚本中扩展为Java生成的脚本类路径时出错,java,powershell,shellexecute,Java,Powershell,Shellexecute,简介: 我正在尝试将shell脚本从UNIX转换为Powershell。 脚本不能“硬编码”路径,但必须列出一个目录,以便在运行时动态构建路径 此外,脚本必须传入1个参数以指示运行的“类型” 我正在将我的“尝试”重写脚本(在多次谷歌搜索/Bing后) 这个脚本可能非常接近,因为“echo”语句生成了似乎正确的内容 $EXE_CLASS="com.sungard.sims.dacar.standalone.Dacar" #$DACAR_TAG=%1 $JAVA_EXE="$ENV:JDK15\jr

简介: 我正在尝试将shell脚本从UNIX转换为Powershell。 脚本不能“硬编码”路径,但必须列出一个目录,以便在运行时动态构建路径

此外,脚本必须传入1个参数以指示运行的“类型”

我正在将我的“尝试”重写脚本(在多次谷歌搜索/Bing后)

这个脚本可能非常接近,因为“echo”语句生成了似乎正确的内容

$EXE_CLASS="com.sungard.sims.dacar.standalone.Dacar"
#$DACAR_TAG=%1
$JAVA_EXE="$ENV:JDK15\jre\bin\java"
#JAVA_EXE=\opt\java\bin\java

$JARS="dist\lib\Dacar-Engine.jar;dist\lib\Dacar-Common.jar;dist\lib\Dacar-Collector.jar;dist\lib\standalone-Dacar.jar;dist\lib\DACAR-CRG.jar;"
#dynamically append all .jar files from the jars directory.
ls jars\*.jar | %  { $JARS +=";jars\"+ $_.name   }

$JAVA_OPTS="-server -Xloggc:.\engine.gc.log -Xmx2048m -Xms2048m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=8 -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCTimeStamps -XX:MaxPermSize=128m -XX:PermSize=128m -DinstName=${DACAR_TAG} -DprocType=ENGINE"

echo "exe:   -> $JAVA_EXE"
echo "opts:  -> $JAVA_OPTS"
echo "jars:  -> $JARS"
echo "class: -> $EXE_CLASS"

& $JAVA_EXE $JAVA_OPTS "-classpath .\configuration;$JARS $EXE_CLASS 1> dacar.out 2> dacar.err"
请注意,我已经注释掉了DACAR|U标记的使用,该标记通常在包含“TEST | DEV | PROD | QA | STRESS |[客户特定值]”的批处理脚本中作为%1传递

以下是输出:

PS C:\dacar> .\startDacar.ps1
exe:   -> c:\Program Files\Java\jdk1.5.0_22\jre\bin\java
opts:  -> -server -Xloggc:.\engine.gc.log -Xmx2048m -Xms2048m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTe
nuringThreshold=8 -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCTimeStamps -XX:MaxPermSize=128m -XX:PermSize=128m -DinstName=TESTING -DprocType=ENGINE
jars:  -> dist\lib\Dacar-Engine.jar;dist\lib\Dacar-Common.jar;dist\lib\Dacar-Collector.jar;dist\lib\standalone-Dacar.jar;dist\lib\DACAR-CRG.jar;;jars\activation.jar;jars
\commons-beanutils-1.6.jar;jars\commons-codec-1.3.jar;jars\commons-collections-3.2.jar;jars\commons-configuration-1.4.jar;jars\commons-dbcp-1.4.jar;jars\commons-digester
-1.6.jar;jars\commons-discovery-0.4.jar;jars\commons-id.jar;jars\commons-lang-2.2.jar;jars\commons-logging-1.0.3.jar;jars\commons-pool-1.5.4.jar;jars\concurrent.jar;jars
\graphics.jar;jars\ha-javamail-1.0-beta-1.jar;jars\hsqldb.jar;jars\ibatis-core-3.0.jar;jars\jcommon-1.0.6.jar;jars\jconn3.jar;jars\jdom.jar;jars\jetty-6.1.15.jar;jars\je
tty-util-6.1.15.jar;jars\jfreechart-1.0.3.jar;jars\jgroups-all.jar;jars\jmxri.jar;jars\jta.jar;jars\junit.jar;jars\log4j-1.2.9.jar;jars\mailapi.jar;jars\postgresql-8.0.3
09.jdbc2ee.jar;jars\postgresql-8.4-701.jdbc3.jar;jars\quartz-1.6.0.jar;jars\servlet-api-2.5-20081211.jar;jars\smtp.jar;jars\svnant.jar;jars\svnClientAdapter.jar;jars\svn
javahl.jar;jars\truezip-6.jar;jars\uic-optional.jar;jars\uic.jar
class: -> com.sungard.sims.dacar.standalone.Dacar
Unrecognized option: -server -Xloggc:.\engine.gc.log -Xmx2048m -Xms2048m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepG
 -XX:MaxTenuringThreshold=8 -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCTimeStamps -XX:MaxPermSize=128m -XX:PermSize=128m -DinstName=TESTING -DprocType=ENGINE
Could not create the Java virtual machine.
如果我不能弄清楚这一点,添加标签将是我的下一个问题

仅供参考,在ps1脚本中,我可以使用以下命令成功启动程序:

& "c:\Program Files\Java\jdk1.6.0_20\jre\bin\java" -server -Xloggc:.\engine.gc.log -Xmx2048m -Xms2048m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=8 -XX:CMSInitiatingOccupancyFraction=60 -XX:+PrintGCTimeStamps -XX:MaxPermSize=128m -XX:PermSize=128m -DinstName=TESTING -DprocType=ENGINE -classpath ".\configuration;dist\lib\Dacar-Engine.jar;dist\lib\Dacar-Common.jar;dist\lib\Dacar-Collector.jar;dist\lib\standalone-Dacar.jar;dist\lib\DACAR-CRG.jar;;jars\activation.jar;jars\commons-beanutils-1.6.jar;jars\commons-codec-1.3.jar;jars\commons-collections-3.2.jar;jars\commons-configuration-1.4.jar;jars\commons-dbcp-1.4.jar;jars\commons-digester-1.6.jar;jars\commons-discovery-0.4.jar;jars\commons-id.jar;jars\commons-lang-2.2.jar;jars\commons-logging-1.0.3.jar;jars\commons-pool-1.5.4.jar;jars\concurrent.jar;jars\graphics.jar;jars\ha-javamail-1.0-beta-1.jar;jars\hsqldb.jar;jars\ibatis-core-3.0.jar;jars\jcommon-1.0.6.jar;jars\jconn3.jar;jars\jdom.jar;jars\jetty-6.1.15.jar;jars\jetty-util-6.1.15.jar;jars\jfreechart-1.0.3.jar;jars\jgroups-all.jar;jars\jmxri.jar;jars\jta.jar;jars\junit.jar;jars\log4j-1.2.9.jar;jars\mailapi.jar;jars\postgresql-8.0.309.jdbc2ee.jar;jars\postgresql-8.4-701.jdbc3.jar;jars\quartz-1.6.0.jar;jars\servlet-api-2.5-20081211.jar;jars\smtp.jar;jars\svnant.jar;jars\svnClientAdapter.jar;jars\svnjavahl.jar;jars\truezip-6.jar;jars\uic-optional.jar;jars\uic.jar" com.sungard.sims.dacar.standalone.Dacar

但这并不是一个真正的选项,因为这只是以硬编码的方式调用它。

关于PowerShell变量扩展,需要注意的一点是,如果它不是简单的$variable表达式,通常需要使用大括号或子表达式对其进行转义

所以这一行:

$JAVA_EXE="$ENV:JDK15\jre\bin\java"
可表示为:

$JAVA_EXE="${ENV:JDK15}\jre\bin\java"
或者

编辑:显然是PowerShell 正确评估所有3个示例。我 似乎不记得第一个语法 工作,但可能是在 PowerShell 1.0或CTP

我经常建议人们在使用外部.exe命令时做的另一个有用提示是使用Set alias命令将其映射到别名。通过这种方式,它使使用命令更加自然,因为您不必使用&“string”语法


进行了建议的更改,虽然这可能会增加脚本的可读性,它通常给出相同的错误:java.exe:无法识别的选项:-server-Xloggc:。\engine.gc.log-Xmx2048m-Xms2048m-XX:NewSize=512m-XX:MaxNewSize=512m-XX:SurvivorRatio=8-XX:+UseParNewGC-XX:+UseCon-cMarkSweepGC-XX:MaxTenuringThreshold=8-XX:cmsinitiatiatingcoccumencyfraction=60-XX:+printgtimestamps-XX:MaxPermSize=128m-XX:PermSize=128m-DinstName=-DprocType=ENGINE At C:\dacar\startDacar.ps1:16 char:5+javajosh:在字符串中,冒号仍然被视为变量名的一部分,因此
$Env:Foo
在双引号字符串中的作用与预期相同。您不需要在那里使用
$()
${}
。知道我为什么不能让这个简单的测试正常工作吗?我应该做一个简单的下载示例吗?还是上面有足够的细节可以看出潜在的问题?@Johannes,是的,我在发布后不久就编辑了我的答案,因为我意识到了错误。你知道1.0是否有不同的处理方式吗?我认为自己是一个非常先进的PoS壳用户,不知怎么说,我一直认为冒号“终止”变量表达式。@锅炉,我认为问题是,你把多个选项打包成一个字符串变量,然后作为一个单一的参数传递给外部命令行解析器。换句话说,考虑这一点:$F=“C:\PATH带有空间\BLAH.TXT”;SomeCommand$f;当PowerShell调用SomeCommand时,它将传递带引号的$f,因此将其视为单个参数。能否将$java_opts变量分解为静态文本和多个变量的组合?最后,结尾的重定向参数不会按照您的想法进行解释。将它们移出字符串文本。
$JAVA_EXE="$($ENV:JDK15)\jre\bin\java"
Set-Alias java "$($ENV:JDK15)\jre\bin\java.exe"
java blah1 blah2 etc