【问题标题】:C# cannot find file specifiedC# 找不到指定的文件
【发布时间】:2011-01-13 12:32:43
【问题描述】:

您好,我正在尝试创建一个使用 msg.exe 通过网络发送消息的应用。

当我从 cmd 执行 msg 时,一切正常,但是当我以无法打开的形式打开 cmd 时,使用 cmd 转到 system32 文件夹并且文件未显示在那里,但是当我正常浏览或使用 cmd 时它是并且一切都有效

在另一台电脑上测试过,应用运行良好,在这个 1 上运行 win 7 64 位。

这是我用来打开 cmd 的代码示例:

Process.Start("cmd");

我以管理员身份运行我也尝试过直接从 msg.exe 执行它,这似乎是 64 位的问题,适用于所有 32 位系统,但不适用于任何 64 位

编辑:好的,我发现运行 64 位 32 位应用程序时无法在系统 32 文件夹中运行 64 位应用程序的问题。当尝试访问此文件夹时,它会将您重定向到 %WinDir%\SysWOW64 解决方法是使用此路径 C:\Windows\Sysnative\file (%windir%\Sysnative)

【问题讨论】:

  • 添加一些代码,让你的问题更清楚一点。你有什么问题?
  • 当您尝试直接从命令提示符执行msg.exe 时,您是否以管理员身份登录?
  • 是的,我以管理员身份运行,尝试使用 msg.exe 直接使用 Process.Start("msg.exe", "/C msg /server:xxx xxx message");给我错误系统找不到指定的文件

标签: c# .net cmd process.start


【解决方案1】:

问题中提到的解决方案对我来说有什么诀窍 - 在此处发布可测试的解决方案以供后代使用:

public class Messenger : IMessenger
{
    private readonly IProcessWrapper _process;

    public Messenger(IProcessWrapper process)
    {
        _process = process;
    }

    public void SendMessage(string message)
    {
        var info = new ProcessStartInfo
            {
                WorkingDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "sysnative"),
                FileName = "msg.exe",
                Arguments = string.Format(@" * ""{0}""", message),
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = true,
                Verb = "runas"
            };
        _process.Start(info);
    }
}


public interface IProcessWrapper : IDisposable
{
    IEnumerable<Process> GetProcesses();
    void Start(ProcessStartInfo info);
    void Kill();

    bool HasExited { get; }
    int ExitCode { get; }
}

【讨论】:

    【解决方案2】:

    您是否需要使用 cmd?为什么不使用 Process.Start 直接调用 msg.exe。如果你知道它在哪里,你应该可以运行它。

    【讨论】:

    • 试过了说找不到文件。
    • 据我所知,这似乎是一个 win 64 位问题,它适用于所有 32 位但不适用于 64 位
    【解决方案3】:

    如果你在一个应用程序中,你可能最好直接执行“msg”

    Process.Start("msg");
    

    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "msg.exe";
    startInfo.Arguments = "/SERVER hellowword";
    startInfo.WorkingDirectory = @"C:\Temp";
    startInfo.WindowStyle = ProcessWindowStyle.Maximized;
    startInfo.ErrorDialog = true;
    Process process = Process.Start(startInfo);
    

    【讨论】:

    • 试过代码给了我一个错误窗口无法找到 msg.exe,这有点奇怪我也直接将代码放入其中,但它似乎找不到文件,所以我使用了 cmd 和用它检查目录,它没有列出它。如果我正常使用 cmd 或浏览该文件所在的文件夹。甚至尝试创建一个快捷方式并执行该快捷方式并没有链接到任何东西。
    【解决方案4】:
    Process p = new Process();
    System.Diagnostics.ProcessStartInfo sinfo = new System.Diagnostics.ProcessStartInfo("C:\\Windows\\System32\\msg.exe");
    p.StartInfo.Arguments=String.Format("/server:{0} {1} {2}",toServer,string.Compare(toUser.Trim(), "") == 0 ? "*" : toUser,message);
    p.StartInfo = sinfo;
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.FileName = "msg.exe";
    p.Start();
    

    您可能需要为进程的 StartInfo 设置“用户名”和“密码”。(“msg.exe”驻留在系统文件夹中,并且运行代码的用户没有从该文件夹运行的适当权限文件夹。)

    【讨论】:

    • 对不起,我对编码还是有点陌生​​,我需要更改该代码部分中的任何值吗? toServer 和 toUser 说它在当前上下文中不存在
    • 你需要设置东西(任何在 VS 中显示为红色的东西)! (也可能需要设置 p.StartInfo.UserName | p.StartInfo.Password)
    • 你能给我举个例子吗? :P
    【解决方案5】:

    也许您应该检查要构建的“目标平台”。 在我的 64 位 win7 电脑上,我应该选择“x64”或“Any CPU”让我的代码找到“msg.exe”。

    【讨论】:

      【解决方案6】:

      在某些 Windows 版本上(例如,家庭版,不是专业版/商业版等)msg.exe 不包括在内。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-17
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        • 2012-04-29
        相关资源
        最近更新 更多