Windows环境下从Rust调用kotlinc执行Kotlin脚本遇权限拒绝错误
解决Windows下Rust调用kotlinc执行Kotlin脚本的权限拒绝问题
问题场景
在Windows系统中通过Rust调用kotlinc执行Kotlin脚本,代码片段如下:
let mut script_number: u32 = 0; let script_path: String = format!("run/script-{script_number}.kts"); println!("Running Script: {script_number}"); let mut file = OpenOptions::new() .read(true) .write(true) .create(true) .open(script_path.clone()) .expect("Could not create file"); file.write_all( self.editor .buffer() .expect("Couldn't read buffer.") .text() .as_bytes(), ) .expect("Could not write to file"); let mut child = Command::new("./kotlinc") .arg("-script") .arg(script_path.clone()) .stdout(Stdio::piped()) .spawn() .expect("Could not execute script"); let stdout = child.stdout.take().expect("Could not read output"); let lines = BufReader::new(stdout).lines(); for line in lines { println!("{}", line.unwrap()); } script_number += 1;
错误信息
运行后触发权限拒绝错误:
Running Script: 0 thread 'main' panicked at 'Could not execute script: Os { code: 5, kind: PermissionDenied, message: "Access is denied." }', src\main.rs:265:30 stack backtrace: 0: std::panicking::begin_panic_handler at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library\std\src\panicking.rs:575 1: core::panicking::panic_fmt at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library\core\src\panicking.rs:65 2: core::result::unwrap_failed at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library\core\src\result.rs:1791 3: enum2$<core::result::Result<std::process::Child,std::io::error::Error> >::expect<std::process::Child,std::io::error::Error> at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943\library\core\src\result.rs:1070 4: gui_editor::App::launch at .\src\main.rs:260 5: gui_editor::main at .\src\main.rs:291 6: core::ops::function::FnOnce::call_once<void (*)(),tuple$<> > at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943\library\core\src\ops\function.rs:251 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
问题分析与解决方案
核心问题定位
你怀疑脚本文件无执行权限,但Windows下执行Kotlin脚本不需要脚本文件具备执行权限,kotlinc只需要能读取脚本内容即可。真正的问题出在kotlinc的调用路径或执行权限上:
Windows下kotlinc的正确调用方式
官方分发的kotlinc在Windows系统中是通过kotlinc.bat或kotlinc.cmd脚本启动的,直接调用./kotlinc会因为系统无法识别无后缀的可执行文件而触发权限错误。修改Command的启动路径为:let mut child = Command::new("./kotlinc.bat") // 或 ./kotlinc.cmd .arg("-script") .arg(script_path.clone()) .stdout(Stdio::piped()) .spawn() .expect("Could not execute script");确认kotlinc的权限
检查kotlinc所在目录及kotlinc.bat文件的权限:右键文件→属性→安全选项卡,确保当前用户拥有读取和执行权限。脚本文件的权限(非必需)
若确实需要调整脚本文件权限(比如后续有其他读取需求),可通过Rust的std::os::windows::fs::OpenOptionsExttrait设置Windows文件权限,需要在Cargo.toml中启用std的windows_file_modefeature:[dependencies] std = { version = "1.0", features = ["windows_file_mode"] }然后修改文件创建代码:
use std::os::windows::fs::OpenOptionsExt; use winapi::um::winnt::FILE_ATTRIBUTE_NORMAL; let mut file = OpenOptions::new() .read(true) .write(true) .create(true) .mode(FILE_ATTRIBUTE_NORMAL) // 设置Windows文件属性 .open(script_path.clone()) .expect("Could not create file");注意:这一步不是解决当前权限错误的必要操作,仅作为补充说明。
内容的提问来源于stack exchange,提问作者Orcadeum
相关产品推荐
相关产品推荐

