wine中运行的是windows软件,在我们的windows软件调用命令式通过cmd调用,目前我已知的调用命令有2种:
- start /unix filename arguments
- wineconsonle filename arguments
这2种执行结果都一样
需求
通过调用linux命令,执行命令,并且获取输出结果,再通过对结果数据进行分析。
遇到的问题
调用成功,但是输出结果没有没有重定向到cmd的命令窗口中
问题分析
通过查找wine官方和google,发现了别人遇到了相同的问题,感觉目前wine还没有支持这个功能(不确定是否是方法没有对,如果其他人有解决了这个问题的,欢迎留言)
解决方案
将命令写入到一个辅助脚本中,通过调用脚本,将内容输出到文本文件中,再通过读取文本文件进行下一步的分析,以下是步骤:
- 创建辅助脚本
#!/bin/bash
# 脚本文件名:xrandr_command.sh
# 将命令输出重定向到文件,这里调用xrandr命令
xrandr >output.txt
- 使脚本可执行
通过在终端中运行以下命令,使脚本文件具有可执行权限:
chmod +x xrandr_command.sh
-
在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文件准备好,在安装时设置脚本可执行。