2011-01-13 35 views
5

Tôi đang cố gắng chạy một quá trình java thông qua Powershell trong Windows XP. Đây là lệnh:powershell chạy java quá trình vấn đề

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

Vì vậy, classpath là. và. \ common.jar (Tôi nghĩ java có dấu gạch chéo sai, phải không?) Có hai biến môi trường, một biến "atest1" kia "." và lớp thực thi chính là DW_Install (trong gói mặc định).

Lệnh này hoạt động trong cmd.exe, nhưng không phải là PS. Chuyện gì vậy? PS đang làm gì khi phân tích lệnh này mà CMD không làm (hoặc ngược lại)?

Aaron

+2

Khi bạn nói nó không hoạt động trong Powershell, những gì thực sự xảy ra? – DanielGibbs

+0

Tôi nhận được đầu ra trợ giúp java.exe, như thể tôi vừa gõ 'java' hoặc' java -help'. –

Trả lời

7

Vấn đề là PS vì một số lý do phân tích cú pháp -Dresourcepath=. khác với cmd. Điều gì làm việc là

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

Nó không quan trọng mà cách dấu gạch chéo đi, và nó không quan trọng mà trích dẫn một sử dụng (' hoặc "). Đường dẫn lớp phải được thoát, tuy nhiên, với một số loại trích dẫn. Một thử nghiệm tốt để xem những gì nhận được bởi các thông dịch viên PS là để echo nó. Sau đây:

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

mang lại kết quả như sau:

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

(Chú ý resourcepath và giá trị của resourcepath không trên cùng một dòng.) Trong khi đó, đầu ra để

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

mang lại kết quả sau:

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

Đó là nhiều hơn nữa theo ý thích của chúng tôi.

Mặc dù tôi muốn điều này khi không ai trong số các bạn, tôi hy vọng bài đăng này sẽ giúp các bạn phải triển khai các dự án java trên máy Windows (mặc dù chúng sẽ không chạy trên bất kỳ nền tảng nào khác).

5

Chạy chương trình dòng lệnh bên ngoài từ PowerShell là đôi khi một chút vấn đề vì có PowerShell cho thấy hai chế độ phân tích khác nhau mà có được vu cáo bởi các cú pháp khác nhau nói chương trình bên ngoài.

Trong mọi trường hợp, chạy lệnh trong Powershell yêu cầu sử dụng tiền tố . (dot-"sourcing") hoặc toán tử &.

Bạn có thể workaround này bằng cách đi qua từng thông số cho chương trình bên ngoài như biến riêng biệt, như vậy:

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

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

nhập '. java.exe -cp.;. \ common.jar -Dextext = atest1 -Dresourcepath =. DW_Install' và '. java.exe -cp ".;. \ common.jar" -Dcontext = atest1 -Dresourcepath = "." DW_Install' và '. java.exe -cp '.;. \ common.jar' -Dcontext = atest1 -Dresourcepath = '.' DW_Install' cũng không hoạt động. Tuy nhiên, tôi đang bắt đầu quá trình java.exe, vì với tùy chọn đầu tiên, tôi nhận được kết quả sử dụng java. –

+1

(a) Sử dụng '.' chỉ được yêu cầu nếu tên của chương trình sẽ kích hoạt một chế độ phân tích cú pháp khác (' 7za.exe' là một ví dụ) nhưng thậm chí bạn nên sử dụng '&' và không '.' vì bạn không dot-tìm nguồn cung ứng một chương trình bên ngoài. (b) Biến '$ env' sẽ không hoạt động như dự định. – Joey

+0

Bạn đang đúng về biến '$ env'. Tricky phải không? –

1

Sau đây nên làm việc:

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

Tôi đoán rằng PowerShell diễn giải ; trong classpath như dấu phân cách lệnh, do đó cố gắng chạy java -cp ../common.jar -D....

+0

Không, không hoạt động, hãy thử tốt. Tôi đã tìm thấy câu trả lời, xem bên dưới. –

3

Một ví dụ khác dựa trên 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

Cảm ơn thông tin! Đây là một ví dụ hữu ích và nhận được phiếu bầu của tôi. –

Các vấn đề liên quan