【问题标题】:Run bat file with UWP C#使用 UWP C# 运行 bat 文件
【发布时间】:2018-05-02 15:43:26
【问题描述】:

我正在尝试构建 UWP 应用,但遇到了一个问题: 我注意到现在有启动外部可执行文件的方法,但我可以使用 LaunchFile 使用其默认应用程序打开文件(就像这里提到的 https://docs.microsoft.com/en-us/uwp/api/Windows.System.Launcher#Windows_System_Launcher_LaunchFileAsync_Windows_Storage_IStorageFile_)。

它也适用于 .bat 文件吗?如果是 .bat 文件,我应该把它放在哪里。?因为我试图给出一个我写的 .bat 文件的路径,但我遇到了一个异常。

谢谢!!

【问题讨论】:

  • 哪个例外?
  • @MatanShahar System.IO.FileNotFoundException 发生 HResult=0x8007007B 消息=文件名、目录名或卷标语法不正确。 (来自 HRESULT 的异常:0x8007007B)Source= StackTrace:在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)在 System.Runtime .CompilerServices.TaskAwaiter`1.GetResult() at App3.Views.MainPage.d__8.MoveNext() in ...

标签: c# uwp executable launcher


【解决方案1】:

它不会工作。如果您可以让一些第 3 方应用程序默认打开和处理 bat 文件,那么也许可以,但否则像 cmd 或 vbscript 这样的操作系统句柄将不会运行。不确定您的目标是什么,但像 Autohotkey 这样的第 3 方脚本应用程序确实有效。

【讨论】:

  • 但是我创建了一个 bat 文件,当你点击它时它会在 cmd 中运行... @echo off START "runas /user:administrator" cmd /K "cd C:\Users\me\桌面\myFolder\ & runit.exe"
  • 您为什么要尝试从 UWP 应用程序执行此操作?如果您已经拥有runit.exe,那么 UWP 应用会做什么?
  • runit.exe 只是一个运行我的应用程序第一部分的工具...我需要从该 runit.exe 获取结果并对其进行解析。
  • UWP 位于沙箱中。不允许您启动 exe 文件(直接或通过带有 bat 文件的代理)。此外,即使您可以启动该文件,您也需要访问其似乎没有给出异常错误的文件夹。默认情况下,UWP 应用只能访问 appdata 文件夹或安装文件夹。您可以授予它访问 appmanifest 中用户库文件夹的权限。任何其他文件夹访问都需要一个安全令牌,该令牌必须在运行时使用 FilePicker 或 FolderPicker 初始获取。 [链接]docs.microsoft.com/en-us/windows/uwp/files/…
【解决方案2】:

从 .NET 4 开始,有 ProcessProcessStartInfo System.Diagnostics 命名空间下的类允许你 从 C# 到 Win32 应用程序。

public static Task<bool> ExecuteBatchFile(string BatchFilePath, string BatchFileDirectory)
        {
            try
            {
                Task<bool> executeBatchFileTask = Task.Run<bool>(() =>
                {
                    bool hasProcessExited = false;
                    ProcessStartInfo startInfo = new ProcessStartInfo()
                    {
                        FileName = BatchFilePath,
                        CreateNoWindow = false,
                        UseShellExecute = true,
                        WindowStyle = ProcessWindowStyle.Normal,
                        WorkingDirectory = BatchFileDirectory
                    };

                    // Start the process with the info we specified.
                    // Call WaitForExit and then the using-statement will close.
                    using (System.Diagnostics.Process exeProcess = System.Diagnostics.Process.Start(startInfo))
                    {
                        while (!exeProcess.HasExited)
                        {
                            //Do nothing  
                        }
                        hasProcessExited = true;
                    }

                    return hasProcessExited;
                });
                return executeBatchFileTask;
            }
            catch (Exception ex)
            {
                throw;
            }
        }

并通过以下方式在您的代码中调用此方法:

bool hasBatchFileExecuted = await ExecuteBatchFile(BatchFilePath, BatchFilePathDirectory);

创建您自己的批处理文件,例如:

1) 在记事本中创建一个文本文件,并在另存为类别和所有文件下保存为run.bat。

2) 编写以下代码来执行 C# 程序/但是您也可以编写自己的命令:

csc someRandomCode.cs
pause

3) 保存并退出。

【讨论】:

  • 那我该怎么办?我是否也需要添加该功能(ExecuteBatchFile)?或者只是在我的应用程序中调用它?
  • 只需在你的应用程序中调用它传递批处理文件路径和批处理文件目录,bool hasBatchFileExecuted = await ExecuteBatchFile(@"C:\Users\Kunal\Desktop\SomeFolder\test.bat", @" C:\Users\Kunal\Desktop\SomeFolder\");像这样,第一个参数是批处理文件的绝对路径,第二个是目录的绝对路径。 C# 将使用 Win32 api,该 api 将在 cmd.exe 下使用,它将产生一个执行批处理文件的进程。
  • 这对 UWP 没有帮助——OP 想要提升为管理员。还要忙着等待看看进程是否已经兴奋是非常浪费的——使用WaitForExit方法或Exited事件。
  • 我不能调用这个函数......如果我在我的应用程序中编写这个应用程序 - 它无法识别 ProcessStartInfo 和 ProcessWindowStyle。
  • 添加 System.Diagonostics 命名空间
猜你喜欢
  • 2012-03-08
  • 2018-09-07
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多