0

コンピュータの起動時にプログラムを起動できるレジストリ キーを追加しようとしています。動作していないようです。これを行うための私のコードは次のとおりです。

String[] execArgs = new String [2];

if ( os.indexOf( "windows" ) > -1 ) {
    File source = Methods.getJar(); //This method simply returns the full path to the running jar file.
    URL url=null;
    url=source.toURL();  
    File f = new File( URLDecoder.decode( url.getFile(), "UTF-8" ) );
    String userDir = System.getProperty("user.home");
    String path ="" ;

    if ( os.indexOf( "7" ) > -1 ) {
        path = (userDir+"/AppData/Roaming/Microsoft/");
    }

    if ( os.indexOf( "vista" ) > -1 ){
        path = (userDir+"/AppData/Roaming/Microsoft/");
    }

    if ( os.indexOf( "xp" ) > -1 ){
        path = (userDir+"/Start Menu/Programs/Startup/");
    }

    path = path.replaceAll("%20"," ");
    System.out.println("Will copy file to " +path);
    File targetDir = new File(path);
    FileUtils.copyFileToDirectory(f, targetDir);//Copy the file to appdata/roaming dir.
    String filename = source.getName();
    int last = filename.lastIndexOf("\\");
    filename = filename.substring(last + 1);
    String fullPath = path+filename;
    int l1 = filename.lastIndexOf(".");
    String fileText = filename.substring(0,l1);
    execArgs[0] = fileText;
    execArgs[1] = fullPath;
    new WinReg().exec(execArgs);  //Add a reg key to add to startup using WinReg class.
}

これが私のWinRegクラスです:

package test;
import java.text.MessageFormat;  

public class WinReg {  
    static final String REG_ADD_CMD = "cmd /c reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"{0}\" /d \"{1}\" /t REG_EXPAND_SZ";  

    void exec(String[] args)throws Exception {  
        if (args.length != 2)  
            throw new IllegalArgumentException("\n\nUsage: java SetEnv {key} {value}\n\n");  

        String key = args[0];  
        String value = args[1];  

        String cmdLine = MessageFormat.format(REG_ADD_CMD, new Object[] { key, value });  
        System.out.println(cmdLine); //get the final cmd that will be run
        Runtime.getRuntime().exec(cmdLine);  
    }  
}  

印刷すると、次のcmdLineようになります。

cmd /c reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Curren
tVersion\Run" /v "Test" /d "C:\Users\CJ/AppData/Roaming/Microsoft/Test.jar" /t R
EG_EXPAND_SZ

このコマンドを手動で実行しようとしましたが、返された構文エラーがわかりませんでした。

4

1 に答える 1

1

cmd /c現在のように機能しない理由は、コマンドにスペースが含まれている場合は引用符で囲む必要があるためです。を使用する場合cmd /c、引用符がネストされているため、正しくフォーマットするのは困難です。

rem Does not work:
cmd /c "reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run" /v "Test" /d "C:\Users\CJ/AppData/Roaming/Microsoft/Test.jar" /t REG_EXPAND_SZ"

あるセットが別のセット内にある引用符は、インタープリターを混乱させます。

ただし、cmd /c不要です。コマンドを直接実行するだけです--

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run" /v "Test" /d "C:\Users\CJ/AppData/Roaming/Microsoft/Test.jar" /t REG_EXPAND_SZ

Java は、コマンド ラインに入力したかのようにコマンドを実行します。上記の 2 番目のコード スニペットのように、コマンド ラインと同じように入力するだけです。

于 2013-01-16T02:02:22.317 に答える