我对正则表达式模式匹配没有任何想法,当我通过exec()命令运行批处理文件时,我遇到文件路径中的单引号问题,我得到以下错误,即
错误是 -
Windows无法找到C:\ Program'。
当CMD尝试进入所需目录时,我遇到单引号问题。 所以,任何人都可以告诉我该怎么做?
我创建了一个批处理文件来编译和运行java程序我有一个名为createrunbat(String,String)的函数,代码如下:
private File createrunbat(String str,String par)
{
if(str.startsWith("Text Editor-",0))
{
str=str.replaceFirst("Text Editor-","");
}
String sng,s2;
File fe;
try{
FileOutputStream fos;
DataOutputStream dos;
sng=str;
int a=sng.indexOf(".");
sng=sng.substring(0,a);
file=new File(jfc.getSelectedFile().getParent(),sng+".bat");
fd=file.getAbsoluteFile();
str=fd.getParent().substring(0, 2);
fos=new FileOutputStream(file);
dos=new DataOutputStream(fos);
dos.writeBytes("@echo off \n");
dos.writeBytes("cd\\"+"\n");
if(fd.getParentFile().isDirectory())
{
dos.writeBytes(str+"\n");
}
s2=jfc.getSelectedFile().getParent();//I am having single quote problem from here
dos.writeBytes("cd "+s2+"\\"+"\n");
dos.writeBytes("javac "+sng+".java"+"\n");
dos.writeBytes("java "+sng+" "+par+"\n");
dos.writeBytes("pause \n");
dos.writeBytes("exit \n");
dos.close();
}
catch(FileNotFoundException ex)
{
}
catch(IOException ex2)
{
JOptionPane.showMessageDialog(this,ex2.toString());
}
return fd;
}
答案 0 :(得分:1)
我认为这是一个更多的情况,路径名中的空白会造成麻烦,您需要在路径周围包装引号
dos.writeBytes ("cd \"" + s2 +"\""+"\n");
答案 1 :(得分:0)
您可能会将错误输出与输入混淆。
Windows cannot find 'C:\Program'.
那里的单引号用于包装有问题的数据,以便开发人员知道导致问题的输入边界。单引号不是程序解释的部分。
正如其他人所说的那样,我认为真正的问题是你路径中的空白。您的命令行将路径读取为两个单独的参数而不是一个。具有讽刺意味的是,将路径包装在引号中可以解决问题。
'C:\Program Files\SomePlace\...'
^ gets cut on whitespace and becomes two arguments instead of one:
'C:\Program' and 'Files\SomePlace\...'
'"C:\Program Files\SomePlace\..."'
^ quotes will keep the path together as a single argument
编辑:如何包装路径。
Java1在他们的答案中有一个很好的解决方案,所以我将提供一个使用字符串格式的替代方案。
String safePath = String.format("\"%s\"", jfc.getSelectedFile().getParent().getAbsolutePath());
在这种情况下,String.format()方法的第一个参数是要使用的模式,第二个是要替换的变量。
必须转义路径周围的实际引号(\"
),因为它们在java中具有特殊含义以表示String的开头或结尾。您必须转义它们才能在String中使用它们。占位符是放置路径的位置(%s
)。
旁注:
您应该在代码中使用更多描述性变量名称。使用s2
,sng
,fe
,fd
等名称是非常糟糕的做法。对您的命名和跟踪具有描述性和准确性,调试和编写代码将变得更加容易。