在ProcessBuilder中转义空间

时间:2013-09-30 10:47:34

标签: java powershell processbuilder

我无法在Eclipse中执行以下代码:

public static void main(String[] arg){
    String path="C:\\Users\\my dir\\SendMailPS.ps1";
    ProcessBuilder processBuilderObject
                = new ProcessBuilder("powershell",path);
    try {
        processBuilderObject.start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但如果路径为C:\\Users\\SendMailPS.ps1,我可以执行它。所以问题在于空格,我该如何解决呢?

编辑:我也是这样尝试的

public static void main(String[] arg){
    String path="C:\\Users\\my dir\\SendMailPS.ps1";
    try {
        Runtime.getRuntime().exec("powershell "+path);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

但没用。然后我直接从命令提示符

尝试
>powershell
> C:\Users\SendMailPS.ps1

这给了我输出。但是以下行给了我错误

>powershell
> C:\Users\my dir\SendMailPS.ps1

错误:

  

C:\ Users \ my:术语“C:\ Users \ my”未被识别为   cmdlet的名称,函数,脚本文件或可运行的程序。检查   拼写名称,或者如果包含路径,请验证路径是否正确   纠正,然后再试一次。

1 个答案:

答案 0 :(得分:2)

String path="C:\\Users\\my dir\\SendMailPS.ps1";
ProcessBuilder processBuilderObject
            = new ProcessBuilder("powershell",path);

您在这里实际做的是运行一个调用SendMailPS脚本的单行PowerShell脚本。单行脚本受PowerShell脚本解析的影响,这会导致您的问题。

尝试以这种方式运行脚本:

String path="C:\\Users\\my dir\\SendMailPS.ps1";
ProcessBuilder processBuilderObject
            = new ProcessBuilder("powershell", "-File", path);

这明确告诉Powershell将指定的文件作为脚本运行。

在此处使用字符串连接:

// Don't do this
ProcessBuilder processBuilderObject
            = new ProcessBuilder("powershell -File " + path); // Don't do this
// Don't do this

尝试以这种方式运行会给你带来更多麻烦。