草庐IT

java - ProcessBuilder 对我在 Windows 上的命令行参数做了一些事情

coder 2024-06-10 原文

我可以在 Windows 上做什么来阻止它重新标记我的命令行参数?

它在 Linux 和 OS X 上工作得很好。

代码如下:

import java.lang.*;
import java.io.*;
import java.util.*;
public class test {
    public static void main (String[] args) throws IOException, InterruptedException {
        if (args.length == 0) {
            ArrayList<String> childargs = new ArrayList<String>();
            childargs.add("java");
            childargs.add("test");
            childargs.add("--p='sprintf(\"%8d %13s\")'");
            for (String s : childargs)
                System.out.println(String.format("Parent: arg=<%s>", s));
            ProcessBuilder pb = new ProcessBuilder(childargs);
            pb.inheritIO();
            Process p = pb.start();
            int rc = p.waitFor();
            System.out.println("Parent: child rc=" + rc);
        } else {
            for (int i=0; i<args.length; i++)
                System.out.println(String.format("Child:  arg=<%s>", args[i]));
            System.exit(3);
        }
    }
}

在 Linux 和 OS X 上,这是它打印的内容。

$ java test
Parent: arg=<java>
Parent: arg=<test>
Parent: arg=<--p='sprintf("%8d %13s")'>
Child:  arg=<--p='sprintf("%8d %13s")'>
Parent: child rc=3

在 Windows 7 Professional 上打印这个

> java test
Parent: arg=<java>
Parent: arg=<test>
Parent: arg=<--p='sprintf("%8d %13s")'>
Child:  arg=<--p='sprintf(%8d>
Child:  arg=<%13s)'>
Parent: child rc=3

我想要的是让 child 的命令行参数与 parent 给它的命令行参数相同。我不希望将论点分解成多个部分。而且我宁愿不必编写依赖于平台的代码。

最佳答案

反斜杠有效。来自 CommandLineToArgvW 的描述:

CommandLineToArgvW has a special interpretation of backslash characters when they are followed by a quotation mark character ("), as follows:

  • 2n backslashes followed by a quotation mark produce n backslashes followed by a quotation mark.
  • (2n) + 1 backslashes followed by a quotation mark again produce n backslashes followed by a quotation mark.
  • n backslashes not followed by a quotation mark simply produce n backslashes.

Net 是使用反斜杠保留参数中的双引号。因此,一个更简单的解决方案是在 Windows 上有条件地反斜杠双引号:

import java.lang.*;
import java.io.*;
import java.util.*;
public class test {
    public static void main (String[] args) throws IOException, InterruptedException {
        if (args.length == 0) {
            ArrayList<String> childargs = new ArrayList<String>();
            childargs.add("java");
            childargs.add("test");
            String quotedArg = "--p='sprintf(\"%8d %13s\")'";
            //
            // HERE'S THE KEY CODE FRAGMENT
            //
            if (isWin()) {
                quotedArg = quotedArg.replace("\"", "\\\"");
            }
            childargs.add(quotedArg);
            for (String s : childargs)
                System.out.println(String.format("Parent: arg=<%s>", s));
            ProcessBuilder pb = new ProcessBuilder(childargs);
            pb.inheritIO();
            Process p = pb.start();
            int rc = p.waitFor();
            System.out.println("Parent: child rc=" + rc);
        } else {
            for (int i=0; i<args.length; i++)
                System.out.println(String.format("Child:  arg=<%s>", args[i]));
            System.exit(3);
        }
    }

    static boolean isWin() {
        return System.getProperty("os.name").toLowerCase().indexOf("win") >= 0;
    }
}

这会在 *nix 上产生以下输出:

Parent: arg=<java>
Parent: arg=<test>
Parent: arg=<--p='sprintf("%8d %13s")'>
Child:  arg=<--p='sprintf("%8d %13s")'>
Parent: child rc=3

在 Windows 上:

Parent: arg=<java>
Parent: arg=<test>
Parent: arg=<--p='sprintf(\"%8d %13s\")'>
Child:  arg=<--p='sprintf("%8d %13s")'>
Parent: child rc=3

关于java - ProcessBuilder 对我在 Windows 上的命令行参数做了一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34402429/

有关java - ProcessBuilder 对我在 Windows 上的命令行参数做了一些事情的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  5. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐