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

如何启动作为资源的进程?解决Win32Exception找不到文件问题

问题解决方法

主问题:无法通过资源启动bat进程的原因及修复

当你把test.bat添加为项目资源时,它会被存储为文本内容(字符串)或者字节数组,而Process.StartInfo.FileName要求传入的是文件的物理路径,不是文件内容——你直接传资源内容,系统自然找不到对应的文件,所以抛出找不到文件的错误。

正确的做法是把资源中的bat内容写入到临时文件,再通过临时文件路径启动进程,修改后的代码如下:

public async void button_A_Click(object sender, EventArgs e)
{
    button_A.Enabled = false;
    await Task.Run(() => {
        // 1. 获取资源中的bat内容
        string batContent = LOS_Installer.Properties.Resources.test;
        // 2. 创建唯一的临时bat文件
        string tempBatPath = Path.Combine(Path.GetTempPath(), $"temp_test_{Guid.NewGuid()}.bat");
        File.WriteAllText(tempBatPath, batContent);

        var proc = new Process();
        proc.StartInfo.FileName = tempBatPath; // 使用临时文件路径
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.Arguments = path;
        
        try
        {
            if (proc.Start())
            {
                void outputCallback(string data)
                {
                    if (!string.IsNullOrEmpty(data))
                    {
                        textBoxLog.AppendText(data);
                        textBoxLog.AppendText(Environment.NewLine);
                    }
                }
                proc.OutputDataReceived += (_, e) => Invoke(outputCallback, e.Data);
                proc.ErrorDataReceived += (_, e) => Invoke(outputCallback, e.Data);
                proc.BeginOutputReadLine();
                proc.BeginErrorReadLine();
            }
            proc.WaitForExit();
        }
        finally
        {
            // 3. 进程结束后清理临时文件
            if (File.Exists(tempBatPath))
            {
                File.Delete(tempBatPath);
            }
        }
    });
    button_A.Enabled = true;
}

说明:

  • 用Guid.NewGuid()生成唯一文件名,避免临时文件冲突
  • finally块保证无论进程执行结果如何,临时文件都会被删除
  • 新增空值判断,避免日志中出现无效空行

附带问题:同名不同扩展名的资源处理

项目资源管理器在添加同名不同扩展名的文件时,会自动给资源名称加后缀(比如test.bat和test.txt添加后,资源名称会变成test和test1)。你也可以手动修改资源的名称属性(在资源编辑器的“名称”列),比如把test.bat的资源名改成test_bat,test.txt改成test_txt,这样就能明确区分不同资源,避免混淆。

内容的提问来源于stack exchange,提问作者Ooker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:40:23