Windows】【DevOps】Windows Server 2022 采用WinSW 启动一个会创建新的控制台程序窗口的程序行为分析

WinSW使用参考

【Windows】【DevOps】Windows Server 2022 采用WinSW将一个控制台应用程序作为服务启动(方便)-CSDN博客

源码

调整ConsoleApp1程序源代码如下:

复制代码
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // 检查是否作为子进程启动
        if (args.Length > 0 && args[0] == "child")
        {
            ChildProcessMain(args);
        }
        else
        {
            ParentProcessMain();
        }
    }

    static void ParentProcessMain()
    {
        // 获取当前可执行文件的路径
        string currentExePath = System.Reflection.Assembly.GetEntryAssembly()?.Location ?? throw new InvalidOperationException("Could not retrieve entry assembly location.");

        // 设置启动信息
        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = currentExePath,
            Arguments = "child", // 传递参数 "child"
            UseShellExecute = true, // 使用操作系统外壳程序
            RedirectStandardOutput = false, // 不重定向标准输出
            CreateNoWindow = false // 允许创建新窗口
        };

        // 启动新进程
        using (Process process = Process.Start(startInfo))
        {
            if (process != null)
            {
                Console.WriteLine("Child process started successfully.");
            }
            else
            {
                Console.WriteLine("Failed to start the child process.");
            }
        }

        Console.WriteLine("Parent process continues to run...");
        Console.ReadLine(); // 防止主进程立即退出
    }

    // 子进程部分 - 需要添加到你的可执行文件中
    static void ChildProcessMain(string[] args)
    {
        if (args.Length > 0 && args[0] == "child")
        {
            Console.WriteLine($"Child process received argument: {args[0]}");

            // 获取程序的启动目录
            string startupDirectory = Directory.GetCurrentDirectory();

            // 文件路径
            string filePath = Path.Combine(startupDirectory, "log.txt");

            // 使用 StreamWriter 写入文件
            using (StreamWriter writer = File.AppendText(filePath))
            {
                while (true)
                {
                    writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    writer.Flush();
                    Thread.Sleep(1000); // 每秒写入一次
                }
            }
        }
        else
        {
            Console.WriteLine("Child process did not receive expected argument.");
        }
    }
}

桌面启动时效果

主程序启动后,弹出了子程序控制台窗口

WinSW服务启动效果

日志

out.log中只有主程序的日志,子程序的标准输出日志丢失了。

可以调整子程序标准输出重定向到主程序来解决。

ProcessStartInfo startInfo = new ProcessStartInfo

{

FileName = currentExePath,

Arguments = "child", // 传递参数 "child"

UseShellExecute = true, // 使用操作系统外壳程序

RedirectStandardOutput = true, // 重定向标准输出

CreateNoWindow = false // 允许创建新窗口

};

子进程状态

观察子进程日志文件,可以确定子进程除了不显示窗口,其他部分工作正常

关于关闭服务

复制代码
Stop-Service ConsoleApp1Service

指令成功调用后,ConsoleApp1.exe自己启动起来的子进程不会被杀死

相关推荐
透明的玻璃杯1 小时前
window环境下使用类似tail的命令跟踪滚动的日志
windows
私人珍藏库2 小时前
【windows】跨平台 Android 刷机Root工具箱
android·windows·工具·刷机·软件·多功能
航Hang*5 小时前
Windows Server 配置与管理——第12章:配置数字证书服务器
运维·服务器·windows
百事牛科技7 小时前
保护文档安全:PDF限制功能实操方法
windows·pdf
夏冰加密软件7 小时前
【实测】文件加密软件解除保护的2种方法(以超级加密3000为例)
windows·安全
猫头虎7 小时前
Windows毫秒级文件名搜索工具Everything最新版下载、安装、配置、新功能解析指南
windows·everything
成都易yisdong10 小时前
实现三北方向转换计算器(集成 WMM2025 地磁模型)
开发语言·windows·算法·c#·visual studio
idolao10 小时前
Design Expert 13安装教程 Windows版:解压+自定义路径+Crack替换指南
windows
沈跃泉10 小时前
C++串口类实现
c++·windows·串口通信·串口类
dashizhi201512 小时前
电脑禁用U口、禁用USB端口、屏蔽移动存储设备使用的方法
windows·安全·电脑