wine中的软件如何运行linux命令并获取输出结果

wine中运行的是windows软件,在我们的windows软件调用命令式通过cmd调用,目前我已知的调用命令有2种:

  • start /unix filename arguments
  • wineconsonle filename arguments

这2种执行结果都一样

需求

通过调用linux命令,执行命令,并且获取输出结果,再通过对结果数据进行分析。

遇到的问题

调用成功,但是输出结果没有没有重定向到cmd的命令窗口中

问题分析

通过查找wine官方和google,发现了别人遇到了相同的问题,感觉目前wine还没有支持这个功能(不确定是否是方法没有对,如果其他人有解决了这个问题的,欢迎留言)

解决方案

将命令写入到一个辅助脚本中,通过调用脚本,将内容输出到文本文件中,再通过读取文本文件进行下一步的分析,以下是步骤:

  1. 创建辅助脚本
#!/bin/bash
# 脚本文件名:xrandr_command.sh
# 将命令输出重定向到文件,这里调用xrandr命令
xrandr >output.txt
  1. 使脚本可执行
    通过在终端中运行以下命令,使脚本文件具有可执行权限:
chmod +x xrandr_command.sh
  1. 在wine中调用脚本
    在Wine运行的Windows应用程序中,使用以下方法之一调用这个脚本:

    • 命令行界面:如果Windows应用程序提供了命令行界面或终端,可以直接在其中调用脚本。

    • 批处理文件:在Windows应用程序中创建一个批处理文件(.bat或.cmd),使用start或call命令执行Linux脚本。

    • Wine的Unix域套接字:Wine提供了Unix域套接字功能,允许Wine中的程序调用外部Unix程序。你可以使用wineconsole命令来运行脚本

      xrandr_command.sh
      

以下是在c#代码中通过process调用cmd命令的方法来调用:

        /// <summary>
        /// 获取输出数据
        /// </summary>
        /// <returns></returns>
        private string GetOutputData()
        {
            // 说明这个命令也可:wineconsole xrandr_command.sh 
            var process = StartCmd("xrandr_command.sh &exit");
            process.WaitForExit();
            var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "output.txt");
            //注意,如果这里提示文件不存在,那么建议这里稍微等待一下
            var str = File.ReadAllText(fileName);
            return str;
        }
        /// <summary>
        /// 启动cmd执行命令
        /// </summary>
        /// <param name="inputCommand">输入命令</param>
        /// <returns></returns>
        public static Process StartCmd(string inputCommand)
        {
            var process = new System.Diagnostics.Process();
            process.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动 
            process.StartInfo.RedirectStandardInput = true; // 接受来自调用程序的输入信息 
            process.StartInfo.FileName = "cmd.exe";
            process.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
            process.Start(); 
            process.StandardInput.WriteLine(inputCommand); //向cmd窗口发送输入信息
            return process;
        }

说明:如果在实际场景中,不需要获取输出结果,只需要调整命令即可。
注:在实际场景中,设置.sh脚本文件可执行需要root权限,当前程序可能由于权限原因不能执行操作,这时可以通过迂回的方式,在安装的时候提前将.sh文件准备好,在安装时设置脚本可执行。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值