【修改】ps开启关闭提升权限,增加注册表路径
This commit is contained in:
@@ -143,7 +143,6 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
||||
|
||||
if (sqlFileExecuted ) {
|
||||
|
||||
|
||||
Map<String, String> result = readFilesAsMap(stuFilePath);
|
||||
Map<String, String> resultStu = readFilesAsMap(fileStu);
|
||||
|
||||
@@ -1059,6 +1058,16 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
||||
// stmt.executeUpdate(dropDbSql2);
|
||||
|
||||
|
||||
}finally {
|
||||
//删除临时创建的数据库databaseName
|
||||
try (Connection conn = DriverManager.getConnection(newDbUrl, user, password);
|
||||
Statement stmt = conn.createStatement()) {
|
||||
String dropDbSql = "DROP DATABASE " + databaseName;
|
||||
stmt.executeUpdate(dropDbSql);
|
||||
System.out.println("删除临时库");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
appendToFile(answerLogPath, "共得分:" + String.format("%.2f", scoreTotal));
|
||||
@@ -1178,10 +1187,11 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
||||
int index = 1;
|
||||
// 判断表名是否一致
|
||||
String tableNameCheck = tableName.equalsIgnoreCase(tableNameStu) ? "✔" : "x";
|
||||
String tableNameCheckOther = tableName.equalsIgnoreCase(tableNameStu) ? "✅" : "❌";
|
||||
// 输出
|
||||
System.out.printf("%02d.【数据表】【%s】【名称】【%s】【%s】\n", index, dbTable, tableName, tableNameCheck);
|
||||
appendToFile(answerLogPath, "%02d.【数据表】【%s】【名称】【%s】【%s】\n", index, dbTable, tableName, tableNameCheck);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【数据表】【%s】【名称】【%s】【%s】\n", index, dbTable, tableName, tableNameCheck);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【数据表】【%s】【名称】【%s】【%s】\n", index, dbTable, tableName, tableNameCheckOther);
|
||||
// 把Set转成Map,方便通过字段名快速取值
|
||||
Map<String, Map<String, String>> standardMap = convertSetToMap(standardSet);
|
||||
Map<String, Map<String, String>> studentMap = convertSetToMap(studentSet);
|
||||
@@ -1193,8 +1203,9 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
||||
String fullName = dbTable + "." + columnName;
|
||||
|
||||
String nameCheck = stuCol != null ? "✔" : "x";
|
||||
String nameCheckOther = stuCol != null ? "✅" : "❌";
|
||||
System.out.printf("%02d.【字段】【%s】【名称】【%s】【%s】\n", ++index, fullName, columnName, nameCheck);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【字段】【%s】【名称】【%s】【%s】\n", index, fullName, columnName, nameCheck);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【字段】【%s】【名称】【%s】【%s】\n", index, fullName, columnName, nameCheckOther);
|
||||
appendToFile(answerLogPath, "%02d.【字段】【%s】【名称】【%s】【%s】\n", index, fullName, columnName, nameCheck);
|
||||
|
||||
if (stuCol != null) {
|
||||
@@ -1232,9 +1243,10 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
||||
private static MysqlVo compareField(int index, String fullName, String property, String stdValue, String stuValue, String judgementStr) {
|
||||
MysqlVo mysqlVo=new MysqlVo();
|
||||
String mark = stdValue.equalsIgnoreCase(stuValue) ? "✔" : "x";
|
||||
String markOther = stdValue.equalsIgnoreCase(stuValue) ? "✅" : "❌";
|
||||
System.out.printf("%02d.【字段】【%s】【%s】【%s】【%s】\n", index + 1, fullName, property, stuValue, mark);
|
||||
appendToFile(answerLogPath, "%02d.【字段】【%s】【%s】【%s】【%s】\n", index + 1, fullName, property, stuValue, mark);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【字段】【%s】【%s】【%s】【%s】\n", index + 1, fullName, property, stuValue, mark);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【字段】【%s】【%s】【%s】【%s】\n", index + 1, fullName, property, stuValue, markOther);
|
||||
mysqlVo.setText(judgementStr);
|
||||
mysqlVo.setIndex(index + 1);
|
||||
return mysqlVo;
|
||||
@@ -1244,7 +1256,7 @@ public class IMysqlLocalServiceImpl implements IMysqlLocalService {
|
||||
MysqlVo mysqlVo=new MysqlVo();
|
||||
System.out.printf("%02d.【字段】【%s】【%s】【%s】【x】\n", index + 1, fullName, property, stdValue);
|
||||
appendToFile(answerLogPath, "%02d.【字段】【%s】【%s】【%s】【x】\n", index + 1, fullName, property, stdValue);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【字段】【%s】【%s】【%s】【x】\n", index + 1, fullName, property, stdValue);
|
||||
judgementStr = HtmlAppender.appendHtmlLineMysql(judgementStr, "%02d.【字段】【%s】【%s】【%s】【❌】\n", index + 1, fullName, property, stdValue);
|
||||
mysqlVo.setText(judgementStr);
|
||||
mysqlVo.setIndex(index + 1);
|
||||
return mysqlVo;
|
||||
|
@@ -92,7 +92,7 @@ public class PsServiceImpl implements PsService{
|
||||
double finalScore = ((totalScore / maxPossibleScore) * score);
|
||||
double finalScoreRatio = Math.round(finalScore * 100.0) / 100.0; // 四舍五入到2位小数
|
||||
appendToFile(answerLogPath, "最终得分: " + finalScoreRatio);
|
||||
judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "最终得分: " +finalScoreRatio);
|
||||
// judgementStr = HtmlAppender.appendHtmlLine(judgementStr, "最终得分: " +finalScoreRatio);
|
||||
sourceAndText.setScore(finalScoreRatio);
|
||||
sourceAndText.setText(judgementStr);
|
||||
return sourceAndText;
|
||||
|
@@ -32,30 +32,42 @@ public class PsUtil {
|
||||
|
||||
// 尝试读取多个注册表路径获取 Photoshop 路径
|
||||
public static String findPhotoshopExe() {
|
||||
// 常见的注册表路径(顺序很重要,优先尝试最常见的)
|
||||
String[] regPaths = {
|
||||
"HKLM\\SOFTWARE\\Classes\\Applications\\Photoshop.exe\\shell\\edit\\command",
|
||||
"HKLM\\SOFTWARE\\WOW6432Node\\Classes\\Applications\\Photoshop.exe\\shell\\edit\\command"
|
||||
"HKLM\\SOFTWARE\\WOW6432Node\\Classes\\Applications\\Photoshop.exe\\shell\\edit\\command",
|
||||
"HKCU\\SOFTWARE\\Classes\\Applications\\Photoshop.exe\\shell\\edit\\command",
|
||||
"HKLM\\SOFTWARE\\Adobe\\Photoshop",
|
||||
"HKLM\\SOFTWARE\\WOW6432Node\\Adobe\\Photoshop",
|
||||
"HKCR\\Photoshop.Image.13\\shell\\edit\\command",
|
||||
"HKCR\\Photoshop.Image.13\\protocol\\StdFileEditing\\server",
|
||||
"HKCR\\Photoshop.Image.13\\DefaultIcon",
|
||||
};
|
||||
|
||||
for (String path : regPaths) {
|
||||
try {
|
||||
String exePath = queryReg(path);
|
||||
if (exePath != null && !exePath.isEmpty()) {
|
||||
// 通常 exe 路径后面会跟参数 %1,只取 exe 路径部分
|
||||
// 清理掉可能的参数(如 "%1")
|
||||
exePath = exePath.replaceAll("\"", ""); // 去除引号
|
||||
int idx = exePath.toLowerCase().indexOf("photoshop.exe");
|
||||
if (idx != -1) {
|
||||
exePath = exePath.substring(0, idx + "photoshop.exe".length());
|
||||
String psPath = exePath.substring(0, idx + "photoshop.exe".length());
|
||||
if (new File(psPath).exists()) {
|
||||
return psPath;
|
||||
}
|
||||
}
|
||||
return exePath;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 忽略异常,继续尝试其他路径
|
||||
// 忽略错误,尝试下一个路径
|
||||
}
|
||||
}
|
||||
return null; // 没找到
|
||||
|
||||
return null; // 都没找到
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static String runTwoPsdsInOneScript(String psdPath, String jsxTemplatePath, String photoshopExe)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
@@ -63,22 +75,32 @@ public class PsUtil {
|
||||
String baseDir = psdFile1.getParent();
|
||||
String jsxTargetPath = baseDir + File.separator + "run_both_" + System.currentTimeMillis() + ".jsx";
|
||||
|
||||
// 读取 JSX 模板
|
||||
String jsxTemplate = Files.readString(Paths.get(jsxTemplatePath), StandardCharsets.UTF_8);
|
||||
|
||||
// 转义路径
|
||||
String safePath1 = psdPath.replace("\\", "\\\\").replace("'", "\\'");
|
||||
String jsxContent = jsxTemplate
|
||||
.replace("${inputPath1}", safePath1);
|
||||
String jsxContent = jsxTemplate.replace("${inputPath1}", safePath1);
|
||||
|
||||
// 写入最终 JSX 脚本
|
||||
Files.writeString(Paths.get(jsxTargetPath), jsxContent, StandardCharsets.UTF_8);
|
||||
|
||||
String command = String.format("\"%s\" -r \"%s\"", photoshopExe, jsxTargetPath);
|
||||
System.out.println("运行 Photoshop 脚本: " + command);
|
||||
// 构造 PowerShell 提升权限启动 Photoshop 命令
|
||||
String powershellCmd = String.format(
|
||||
"Start-Process -FilePath '%s' -ArgumentList '-r \"%s\"' -Verb RunAs",
|
||||
photoshopExe, jsxTargetPath
|
||||
);
|
||||
|
||||
Process process = Runtime.getRuntime().exec(command);
|
||||
System.out.println("运行 Photoshop 脚本(带权限提升): " + powershellCmd);
|
||||
|
||||
// 异步打印输出日志
|
||||
// 构造 ProcessBuilder 启动 powershell
|
||||
ProcessBuilder builder = new ProcessBuilder("powershell.exe", "-Command", powershellCmd);
|
||||
builder.redirectErrorStream(true); // 合并错误输出
|
||||
Process process = builder.start();
|
||||
|
||||
// 异步读取输出(合并输出流后只需一个线程)
|
||||
new Thread(() -> {
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"))) {
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
System.out.println("[PS OUT] " + line);
|
||||
@@ -86,38 +108,41 @@ public class PsUtil {
|
||||
} catch (IOException ignored) {}
|
||||
}).start();
|
||||
|
||||
new Thread(() -> {
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
System.err.println("[PS ERR] " + line);
|
||||
}
|
||||
} catch (IOException ignored) {}
|
||||
}).start();
|
||||
|
||||
// 不使用 waitFor 阻塞,改成轮询判断两个 JSON 文件是否生成
|
||||
// 不阻塞 waitFor,轮询等待 JSON 文件
|
||||
String jsonPath1 = psdPath.replaceAll("(?i)\\.psd$", ".json");
|
||||
|
||||
int maxWaitSeconds = 60; // 最多等待 60秒,根据实际调整
|
||||
int maxWaitSeconds = 60;
|
||||
int waited = 0;
|
||||
while (!(Files.exists(Paths.get(jsonPath1)))) {
|
||||
Thread.sleep(1000); // 每秒检查一次
|
||||
while (!Files.exists(Paths.get(jsonPath1))) {
|
||||
Thread.sleep(1000);
|
||||
waited++;
|
||||
if (waited > maxWaitSeconds) {
|
||||
// 超时,结束进程并抛异常
|
||||
process.destroyForcibly();
|
||||
// 超时
|
||||
throw new RuntimeException("等待 Photoshop 生成 JSON 文件超时");
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("检测到 JSON 文件生成,关闭 Photoshop 进程...");
|
||||
System.out.println("检测到 JSON 文件生成,尝试关闭 Photoshop...");
|
||||
|
||||
// 手动杀死 Photoshop 进程,确保释放资源
|
||||
Process killProcess = Runtime.getRuntime().exec("taskkill /IM Photoshop.exe /F");
|
||||
killProcess.waitFor();
|
||||
// 构造 PowerShell 提升权限执行 taskkill 命令
|
||||
String powershellKillCmd = "Start-Process -FilePath 'taskkill' -ArgumentList '/IM Photoshop.exe /F' -Verb RunAs";
|
||||
|
||||
// 构造 ProcessBuilder
|
||||
ProcessBuilder builderKill = new ProcessBuilder("powershell.exe", "-Command", powershellKillCmd);
|
||||
builderKill.redirectErrorStream(true); // 合并标准输出和错误输出
|
||||
|
||||
Process processKill = builderKill.start();
|
||||
// 等待进程结束
|
||||
int exitCode = processKill.waitFor();
|
||||
if (exitCode == 0) {
|
||||
System.out.println("提权关闭 Photoshop 成功");
|
||||
} else {
|
||||
System.err.println("提权关闭 Photoshop 失败,退出码:" + exitCode);
|
||||
}
|
||||
|
||||
System.out.println("Photoshop 进程已关闭");
|
||||
|
||||
return jsxTargetPath;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user