2013-01-14 22 views
0

我试图从PowerShell中调用WLST/Jython的/蟒蛇运行的java.exe从PowerShell的

与setWLSEnv.cmd设置CLASSPATH是不正确的会话中设置的参数?所以我试图设置-cp作为参数

& C:\bea\tpc\weblogic1033\server\bin\setWLSEnv.cmd; 
$cp='C:\bea\tpc\WEBLOG~1\server\lib\weblogic.jar' 
$wlst='weblogic.WLST' 
$script='C:\domains\tpc\Domain\bin\status.py' 
$java="C:\PROGRA~1\Java\JROCKI~1.0\bin\java" 
& "$java $cp $wlst $script" 
#or 
. "`"$java`" -cp `"$cp`" $wlst `"$script`"" 
#or 
& "`"$java`" -cp `"$cp`" $wlst `"$script`"" 

我试图引用各种方式的命令字符串没有成功

术语““C:\ PROGRA〜1 \的Java \ JROCKI〜1.0 \ bin \ java“-cp”C:\ bea \ tpc \ WEBLOG〜1 \ server \ lib \ weblogic.jar“weblogic.WLST”C:\ domains \ tpc \ SasTT pcDomain \ bin \ status.py“'is未被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,如果包含路径,请验证路径是否正确,然后重试。在C:_WORK_ \ SAS \​​ statusAll.ps1:15 char:2 +。 < < < < “"$java” -cp "$cp “$ WLST "$script ”“ + CategoryInfo:ObjectNotFound:(” C:\ PROGRA〜1 \ JA ... \ BIN \ status.py“:字符串)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException

回答

1

当您使用的电话运营商&,下一个标记必须是一个命令,没有其他的名字因此,而不是这样的:

& "$java $cp $wlst $script" 

试试这个:

& $java $cp $wlst $script 

有时将参数传递给本地exes会变得很难看。通常的工作原理,但不安全如果您有任何论据来自用户输入的技术是这样的:

Invoke-Expression "$java $cp $wlst $script" 
+0

谢谢,帮助 – ReneHH

0

除了与你如何格式化你的命令转换成字符串的麻烦,setWLSEnv.cmd是为一个脚本Windows命令提示符。 PowerShell无法执行此文件;它不知道如何解释它,就像记事本不知道如何解释docx文件一样。联营的Windows .cmd文件的使用命令提示符,所以你的第一行是相当于

& cmd.exe /c C:\bea\tpc\weblogic1033\server\bin\setWLSEnv.cmd 

(请注意,分号是不必要的,因为你没有在同一行中的任何其他命令。)

这将使用cmd.exe创建一个新进程。这个新进程执行批处理文件,设置您期望的环境变量,然后该进程退出,放弃环境更改。

如果您需要setWLSEnv.cmd在执行程序之前设置环境变量,则应该编写一个调用它的批处理文件,而不是PowerShell脚本。否则,您将需要查找或编写一个PowerShell相当于设置您的环境。

+0

正如我的想法。我只是希望有一些魔法可以强制它在像unix这样的正确会话中执行。 。/ env.sh' – ReneHH

+0

作为替代方案,您可以在PowerShell社区扩展(http://pscx.codeplex.com)中使用'Invoke-BatchFile'命令来执行批处理文件并将环境变化传播回PowerShell进程。 –

+0

@ReneHH PowerShell确实具有相同的功能,但它只适用于PowerShell文件,就像sh-derivatives只能解释用他们的方言编写的文件一样。这并不是说PowerShell缺少功能;这就是PowerShell和命令提示符是两种非常非常不同类型的命令行shell。要求PowerShell运行.cmd文件有点像要求sh-derivative运行批处理文件。 – jpmc26