2011-01-13 16 views
5

Estoy tratando de ejecutar un proceso de Java a través de Powershell en Windows XP. Aquí está el comando:powerhell run problema del proceso de Java

java.exe -cp .;./common.jar -Dcontext=atest1 -Dresourcepath=. DW_Install 

Entonces, el classpath es. y. \ common.jar (creo que java toma las barras equivocadas, ¿no?) Hay dos variables de entorno, una "atest1" y la otra "." y la clase para ejecutar main on es DW_Install (en el paquete predeterminado).

Este comando funciona en cmd.exe, pero no es PS. ¿Que esta pasando? ¿Qué está haciendo PS al analizar este comando que CMD no hace (o viceversa)?

Aaron

+2

Cuando usted dice que no funciona en Powershell, lo que realmente sucede? – DanielGibbs

+0

Obtengo la salida de ayuda java.exe, como si acabara de escribir 'java' o' java -help'. –

Respuesta

7

El problema es que PS por alguna razón analiza -Dresourcepath=. de forma diferente que cmd. Lo que funciona es

java -cp '.;.\common.jar' -Dcontext=atest1 "-Dresourcepath=." DW_Install 

No importa en qué dirección va la barra, y no importa que cita a uno usos (' o "). El classpath debe ser escapado, sin embargo, con algún tipo de comillas. Una buena prueba para ver lo que consigue el intérprete de PS es repetirlo. El siguiente:

echo java -cp '.;.\common.jar' -Dcontext=atest1 -Dresourcepath=. DW_Install 

produce el siguiente resultado:

java 
-cp 
.;.\common.jar 
-Dcontext=etaste1 
-Dresourcepath= 
. 
DW_Install 

(notar la ResourcePath y el valor de ResourcePath no están en la misma línea.) Mientras que la salida a

echo java -cp '.;.\common.jar' -Dcontext=atest1 '-Dresourcepath=.' DW_Install 

produce la siguiente salida:

java 
-cp 
.;.\common.jar 
-Dcontext=etaste1 
-Dresourcepath=. 
DW_Install 

Que es mucho más a nuestro gusto.

Aunque no les deseo esto a ninguno de ustedes, espero que esta publicación les ayude a aquellos de ustedes que deben implementar proyectos java en máquinas con Windows (aunque no se ejecutarán en ninguna otra plataforma).

5

Ejecución de programas de línea de comandos externos de PowerShell es a veces un poco problemático, porque no expone PowerShell dos modos diferentes de análisis que quedan superados por los diferentes sintaxis de dichos programas externos.

En cualquier caso, ejecutar un comando en Powershell requiere utilizar el prefijo . (dot-"sourcing") o el operador &.

Puede solucionar esto pasando cada parámetro para el programa externo como variables independientes, así:

PS> $classpath = ".;./common.jar" 
PS> $env = "-Dcontext=atest1 -Dresourcepath=." 
PS> $class = "DW_Install" 

PS> . java.exe -cp $classpath $env $class 
+0

escribiendo '. java.exe -cp.;. \ common.jar -Dcontext = atest1 -Dresourcepath =. DW_Install' y '. java.exe -cp ".;. \ common.jar" -Dcontext = atest1 -Dresourcepath = "." DW_Install' y '. java.exe -cp '.;. \ common.jar' -Dcontext = atest1 -Dresourcepath = '.' DW_Install' no funciona tampoco. Estoy llegando al proceso java.exe, porque con la primera opción obtengo el resultado de uso de Java. –

+1

(a) El uso de '.' solo es necesario si el nombre del programa activa otro modo de análisis (' 7za.exe' es un ejemplo) pero incluso entonces debería usar '&' y no '.' ya que no está dot-sourcing un programa externo. (b) La variable '$ env' no funcionará según lo previsto. – Joey

+0

Tienes razón sobre la variable '$ env'. Tricky ¿no? –

1

La siguiente debería funcionar:

java.exe -cp '.;./common.jar' -Dcontext=atest1 -Dresourcepath=. DW_Install 

supongo que PowerShell interpreta el ; en el classpath como delimitador de comandos, intentando así ejecutar java -cp . y ./common.jar -D....

+0

No, no funciona, buen intento, sin embargo. He encontrado la respuesta, mira abajo. –

3

Otro ejemplo basado en https://gaming.stackexchange.com/questions/24543/how-do-i-change-player-name-in-minecraft-multiplayer-in-offline-mode-in-linux

function mineCraftAs { 
    Param (
     [parameter(mandatory=$true, HelpMessage="Minecraft character name." ,ValueFromPipeline=$true)] 
     [string] $name 
    ) 
    if(!(test-path $env:appdata)) { $(throw "Appdata not found at $env:appdata")} 
    $private:minecraftPath=Join-Path $env:appdata .minecraft 
    if(!(test-path $minecraftPath)) { $(throw "Minecraft not found at $minecraftpath")} 
    $private:minebinPath=join-path $minecraftPath "bin" 
    if(!(test-path $minebinPath)) { $(throw "Minecraft bin not found at $minebinPath")} 

    $minebinPath | write-debug 
    gci $minebinpath | write-debug 

    #java -Xms512m -Xmx1024m -cp "%APPDATA%/.minecraft\bin\*" -Djava.library.path="%APPDATA%\.minecraft\bin\natives" net.minecraft.client.Minecraft '"'%1'"' 

    echo java -Xms512m -Xmx1024m -cp ('"'+$minebinPath+'\*"') ('-Djava.library.path="'+$minebinPath+'\natives"') net.minecraft.client.Minecraft ($name) 

    $minecraftJob=& 'C:\Program Files (x86)\Java\jre6\bin\java.exe' -Xms512m -Xmx1024m -cp ('"'+$minebinPath+'\*"') ('-Djava.library.path="'+$minebinPath+'\natives"') net.minecraft.client.Minecraft ($name) 
} 
minecraftas newbie 
+0

¡Gracias por la información! Este es un ejemplo útil y obtiene mi voto. –