0

我目前正在开发一个来自 Visual Studio 的 Winforms 程序,它充当一大堆 TeraTerm 宏的控制面板。我做了一个愚蠢的事情,没有将我的第一个工作版本添加到版本控制中,现在它停止工作了,我不知道为什么/如何恢复我所拥有的。

功能是问题是

using System;
using System.IO.Ports;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Diagnostics;

...

namespace Test
{
    public partial class MainWindow : Form
    {

        ...

        private void ImagesButton_Click(object sender, EventArgs e)
        {
            RunMacro("F:\\Users\\Isaac\\Documents\\LED Sign Commands\\Macros\\StartDisplayImages.ttl");
        }

        ....

        private void RunMacro(string userArgument)
        {
            panel1.Enabled = false;
            StatusLabel.Visible = true;
            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo()
            {
                WindowStyle = ProcessWindowStyle.Hidden,
#if DEBUG
                FileName = "F:\\Users\\Isaac\\Documents\\LED Sign Commands\\teraterm\\ttpmacro.exe",
#else
                FileName = "..\\teraterm\\ttpmacro.exe",
#endif
                Arguments = userArgument
            };
            process.StartInfo = startInfo;
            process.Start();
            process.WaitForExit();
            panel1.Enabled = true;
            StatusLabel.Visible = false;
        }

        ...

    }
}

运行时,我看到它ttpmacro.exe确实开始了,如果我省略了Arguments赋值,那么它会提示我选择一个宏;如果我选择StartDisplayImages.ttl,它将按预期运行。但是,如果我将它作为上述参数包含在内,那么ttpmacro仍然会打开但会立即关闭。没有错误出现(并且RedirectStandardOutput/Error什么也没有产生),就好像ttpmacro接受了文件但不会对它做任何事情。我已经确认两个文件路径都是有效且正确的。

虽然我没有添加版本控制,但我确实使用 ILSpy 提取了主文件,并且我在工作版本中的原始功能是:

    private void ImagesButton_Click(object sender, EventArgs e)
    {
        RunMacro("/V ..\\Macros\\StartDisplayImages.ttl");
    }

    private void RunMacro(string userArgument)
    {
        panel1.Enabled = false;
        StatusLabel.Visible = true;
        Process process = new Process();
        ProcessStartInfo startInfo = (process.StartInfo = new ProcessStartInfo
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "..\\teraterm\\ttpmacro.exe",
            Arguments = userArgument
        });
        process.Start();
        process.WaitForExit();
        panel1.Enabled = true;
        StatusLabel.Visible = false;
    }

来自已发布的版本,文件路径是相对于应用程序的文件夹的。除此之外,唯一的区别似乎是如何分配 process.StartInfo 的小语法,但我尝试恢复它没有运气。目标框架是 .NET Core 3.1。旗帜/V不是问题。删除它只会使ttpmacro窗口在关闭前运行的几分之一秒内可见。如果我使用同一文件的命令行执行(例如start "F:/Users/.../ttpmacro.exe" "F:/.../StartDisplayImages.ttl"),它也会按预期运行。

4

1 回答 1

0

原来问题出在完整宏文件路径中的空格,用转义的双引号括起来解决了这个问题。TeraTerm 只是没有告诉我它没有找到文件。应该很明显,但我确信它以前在调试时一直在工作,不需要引号。

于 2021-05-14T03:15:18.213 回答