You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的调用路径或执行权限上:

  1. 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");
    
  2. 确认kotlinc的权限
    检查kotlinc所在目录及kotlinc.bat文件的权限:右键文件→属性→安全选项卡,确保当前用户拥有读取和执行权限。

  3. 脚本文件的权限(非必需)
    若确实需要调整脚本文件权限(比如后续有其他读取需求),可通过Rust的std::os::windows::fs::OpenOptionsExt trait设置Windows文件权限,需要在Cargo.toml中启用std的windows_file_mode feature:

    [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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:24:58