2015-01-08 3 views
0

MyFile.jar 파일이 있습니다. jar 파일을 검색하여 트리거하는 배치 파일이 필요합니다.시스템의 모든 위치에있는 jar 파일을 실행하는 배치 파일을 작성하는 방법

다음 해결책을 찾았습니다. 하지만 배치 파일과 jar 파일은 같은 폴더에 있어야합니다.

java -jar %~dp0MyFile.jar %* 

클라이언트가 시스템에 jar 파일을 둘 위치를 알 수 없습니다. 하지만 그들은 배치 폴더에 배치 파일을 넣을 것입니다.

편집 : 지금이 배치 파일을 작성했습니다.

`ECHO 
ECHO Locating the Jar 

IF EXIST java -jar MyFile.jar ELSE (GOTO 

SearchJar) 

:SearchJar 
SET the_path=D: & CD\ 
DIR /S/B File.jar > installer_location.txt 
SET /P the_path=< installer_location.txt 
if defined the_path goto :FoundIt 

E: & CD\ 
DIR /S/B MyFile.jar > installer_location.txt 
SET /P the_path=< installer_location.txt 
if defined the_path goto :FoundIt 

C: & CD\ 
DIR /S/B MyFile.jar > installer_location.txt 
SET /P the_path=< installer_location.txt 
if defined the_path goto :FoundIt 

G: & CD\ 
DIR /S/B MyFile.jar > installer_location.txt 
SET /P the_path=< installer_location.txt 
if defined the_path goto :FoundIt 

H: & CD\ 
DIR /S/B MyFile.jar > installer_location.txt 
SET /P the_path=< installer_location.txt 
if defined the_path goto :FoundIt 

I: & CD\ 
DIR /S/B MyFile.jar > installer_location.txt 
SET /P the_path=< installer_location.txt 
if defined the_path goto :FoundIt 
ECHO Jar not found. 

:FoundIt 
ECHO Jar file found at %the_path% 

CALL java -jar %the_path%` 

현재 내 시스템에서 작동합니다. 그러나 모든 드라이브를 한꺼번에 검사하는 간단한 방법이 있는지 확실하지 않습니다.

+1

이는 합당한 요청이 아닙니다. 클라이언트가 배치 폴더에 배치 파일을 배치하도록 요구하는 경우 jar 파일을 시작 폴더에 배치하지 않아도됩니다. 배치 파일을 사용하면 파일 시스템에서 jar 파일의 위치, 환경 변수에 의한 파일 시스템 검색 (매우 느림) 또는 특정 위치에 있어야하는 Jar 파일 위치를 알아야합니다. 가장 좋은 방법은 InstallShield와 같은 설치 소프트웨어를 사용하는 것입니다. – gknicker

+0

배치 파일이있는 곳에 jar 파일을 넣으면 '% ~ dp0'는 배치 파일이있는 디렉토리로 평가되기 때문에 게시 한 코드가 작동합니다. 그러나 큰 따옴표로 묶어야합니다 :' "% ~ dp0MyFile .jar "디렉토리에 공백이있을 경우를 대비하여. –

+0

시스템에서 jar 파일을 검색하여 실행하는 배치 파일을 만들 수 없습니까? 내 질문에 언급 한 것처럼, java -jar % ~ dp0MyFile.jar % * (배치 파일의) 위치를 검색하고 배치 파일 위치의 경로를 변경하고 jar 파일을 실행합니다. jar 파일에 대한 배치 파일을 만들 수있는 방법이 있습니까? – Jenny

답변

0

먼저 파일을 찾아 경로에 변수를 설정 한 다음 해당 변수를 원하는 경로로 사용하십시오. % ~ DP0의 사용에서, 당신은 Windows에서 작업하는 가정, 그래서 다음 예는 창

echo off 
for /r C:\search_folder_root %%a in (*) do if "%%~nxa"=="MyFile.jar" set jarLoc=%%~dpa 
java -jar %jarLoc%MyFile.jar %* 

가주의 할입니다 - 검색은 예를 들어, 꽤 오랜 시간이 걸릴 수 있습니다 당신은 전체 드라이브를 검색하면 ...

편집 : OPS의 의견에 응답

는 시스템의 모든 드라이브를 검색하는 스크립트를 요청, 여기 있습니다. 참고 -이 사용은 사용자 경험에 좋은 생각이라고 생각하지 않습니다. 매우 비효율적이며 시간이 오래 걸릴 수 있습니다 ... 초기에 발생하는 경로에 더미 병이있는 매우 간단한 경우에 테스트되었습니다. 내 컴퓨터에서 검색. 주 - 항아리가 어느 드라이브에 있는지, 또는 경로가 나아 졌는지를 사용자가 알게되면, 루핑하는 대신 드라이브/경로를 입력하라는 메시지를 항상 표시 할 수 있습니다.

echo off 
setlocal 
set jarName=MyFile.jar 

rem -- loop through each drive on system -- 
for /F "usebackq skip=1" %%i in (`wmic logicaldisk get caption 2^>NUL`) do (
    echo Checking drive %%i for %jarName% 

    rem -- temporarily change to the drive -- 
    pushd %%i\ 

    rem -- recursively loop through every file of every subdirectory on that drive -- 
    for /r %%a in (*) do (
    if "%%~nxa"=="%jarName%" set jarLoc=%%~dpa 
    if defined jarLoc goto :Found 
) 
    popd 
) 

rem -- if we get to here, the jar has not been found -- 

echo %jarName% not found on any drive in this system 
goto :eof 

:Found 
echo Jar found at %jarLoc% 
popd 
java -jar %jarLoc%%jarName% %* 
+0

나는 이것을 내일 다시 시도 할 것이고 이것이 효과가 있다면 알려주겠다. 하지만 그 전에는 무언가를 시도했고 다음 파일에 대해 더 간단한 해결책이 필요합니다. 여기에 게시 할 수 없습니다. 내가 작성한 배치 파일로 내 게시물을 편집합니다. 그것을 확인하십시오. – Jenny

+0

예, 저는 Windows에서 일하고 있으며 u가 제공 한 배치 파일은 시스템의 모든 드라이브 또는 C 드라이브 만 검색합니까? 감사합니다 :) – Jenny

+0

원래의 대답은 주어진 드라이브를 검색했습니다. 귀하의 의견에 대한 응답으로 시스템의 모든 드라이브를 통과하는 예제를 추가했습니다. 그것은 드라이브를 통과하는 약간 깔끔한 방법입니다 (제 의견으로는). 드라이브 문자에 대한 사전 지식이 필요 없습니다 (예 : 병이 펜 드라이브 또는 비정상적으로 문자가있는 네트워크 드라이브에있을 수 있음). 하지만 실제로는 느려질 가능성이있는 끔찍한 사용자 경험을 제공 할 수 있습니다. –

1

gknicker와 내가 위에서 언급 한대로 이것이 수행되어야하는 방법입니다. NSIS 또는 그와 유사한 설치 프로그램을 사용하여 .jar 파일과 .bat 스크립트를 배포 한 경우 설치 프로그램에서 레지스트리 값을 쓰게하고 검색 또는 파일 찾아보기가 필요하지 않을 수 있습니다. 설치 후 .jar 파일을 이동 한 경우 GUI file chooser을 팝업하고 사용자가 저장된 MyFile.jar 위치를 탐색하도록합니다. 업데이트 된 위치를 레지스트리에 저장하십시오. 파일을 다시 이동하면 다시 프롬프트합니다.

@echo off 
setlocal enabledelayedexpansion 

set "jarfile=MyFile.jar" 
set "regkey=HKLM\Software\Company Name" 
set "regvalue=jarfile" 

set jarpath= 
for /f "tokens=2*" %%I in ('reg query "%regkey%" /v "%regvalue%" 2^>NUL') do (
    set "jarpath=%%~J" 
) 

if not exist "%jarpath%" (
    call :chooser jarpath "%jarfile%" "%jarfile% (*.jar)|*.jar" 
) 

if exist "%jarpath%" (
    reg add "%regkey%" /v "%regvalue%" /t REG_SZ /d "%jarpath%" /f 2>&1>NUL 
) else (
    <NUL set /P "=Unable to locate %jarfile%. This thread will self-destruct in 5 seconds... " 
    ping -n 6 0.0.0.0 >NUL 
    echo bang. 
    exit /b 1 
) 

java -jar "%jarpath%" 

goto :EOF 

:chooser <var_to_set> <filename> <filter> 
:: based on https://stackoverflow.com/questions/15885132 

setlocal enabledelayedexpansion 
:: Does powershell.exe exist within %PATH%? 
for %%I in (powershell.exe) do if "%%~$PATH:I" neq "" (
    set chooser=powershell "Add-Type -AssemblyName System.windows.forms|Out-Null;$f=New-Object System.Windows.Forms.OpenFileDialog;$f.InitialDirectory='%cd%';$f.Filter='%~3';$f.showHelp=$true;$f.Title='Locate %~2';$f.ShowDialog()|Out-Null;$f.FileName" 
) else (
rem :: If not, compose and link C# application to open file browser dialog 
    set chooser=%temp%\chooser.exe 
    >"%temp%\c.cs" echo using System;using System.Windows.Forms; 
    >>"%temp%\c.cs" echo class dummy{ 
    >>"%temp%\c.cs" echo public static void Main^(^){ 
    >>"%temp%\c.cs" echo OpenFileDialog f=new OpenFileDialog^(^); 
    >>"%temp%\c.cs" echo f.InitialDirectory=Environment.CurrentDirectory; 
    >>"%temp%\c.cs" echo f.Filter="%~3"; 
    >>"%temp%\c.cs" echo f.ShowHelp=true; 
    >>"%temp%\c.cs" echo f.Title="Locate %~2"; 
    >>"%temp%\c.cs" echo f.ShowDialog^(^); 
    >>"%temp%\c.cs" echo Console.Write^(f.FileName^);}} 
    for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*csc.exe"') do (
     if not exist "!chooser!" "%%I" /nologo /out:"!chooser!" "%temp%\c.cs" 2>NUL 
    ) 
    del "%temp%\c.cs" 
    if not exist "!chooser!" (
     echo Error: Please install .NET 2.0 or newer, or install PowerShell. 
     goto :EOF 
    ) 
) 

:: capture choice to a variable 
endlocal && for /f "delims=" %%I in ('%chooser%') do set "%~1=%%I" 

:: Clean up the mess 
del "%temp%\chooser.exe" 2>NUL 
goto :EOF 
당신이 MyFile.jar에 대한 모든 로컬 드라이브를 검색하는 주장하면

, 당신은 wmic logicaldisk과 함께 드라이브 목록을 조회 할 수 있습니다. where "not drivetype=4"을 추가하여 네트워크 드라이브를 제외하십시오. 모든 실행에 대해 수분의 지연을 방지하기 위해 결과를 레지스트리에 저장해야합니다.

@echo off 
setlocal 

set "jarfile=MyFile.jar" 
set "regkey=HKLM\Software\Company Name" 
set "regvalue=jarfile" 

set jarpath= 
for /f "tokens=2*" %%I in ('reg query "%regkey%" /v "%regvalue%" 2^>NUL') do (
    set "jarpath=%%~J" 
) 

if not exist "%jarpath%" (
    call :finder jarpath "%jarfile%" 
) 

if exist "%jarpath%" (
    reg add "%regkey%" /v "%regvalue%" /t REG_SZ /d "%jarpath%" /f 2>&1>NUL 
) else (
    <NUL set /P "=Unable to locate %jarfile%. This thread will self-destruct in 5 seconds... " 
    ping -n 6 0.0.0.0 >NUL 
    echo bang. 
    exit /b 1 
) 

java -jar "%jarpath%" 

goto :EOF 

:finder <var_to_set> <file_to_find> 
setlocal 
:: in wmic, drivetype=4 is network drive 
for /f "tokens=2 delims=:=" %%I in (
    'wmic logicaldisk where "not drivetype=4" get DeviceID /format:list ^| find "="' 
) do (
    <NUL set /P "=Searching %%I: for %~2... " 
    for /f "delims=" %%a in ('dir /s /b "%%I:\*%~2"') do (
     echo %%~dpa 
     endlocal & set "%~1=%%a" 
     goto :EOF 
    ) 
    echo Not found. 
) 
goto :EOF 
관련 문제