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自己启动起来的子进程不会被杀死

相关推荐
for_ever_love__11 小时前
python基础语法学习: 数据容器
windows·python·学习
huainingning13 小时前
微软windows系统官网IPV6临时地址介绍
windows·microsoft·智能路由器
.Peter17 小时前
.NET/WPF 程序在部分 Windows 电脑无法保存用户环境变量:使用 DPAPI 实现安全兼容
windows·信息安全·c#·.net·wpf·环境变量·dpapi
码字的特恩18 小时前
微软确认暂不为 Windows 11 加入透明效果自定义功能,建议用户使用第三方工具
人工智能·windows·算法·microsoft·计算机·大模型·编程
神奇小梵18 小时前
安全和开发的需要了解的知识————下载内容的安全,和下载内容如何运行
android·windows·安全·个人开发
zhangfeng113319 小时前
Windows AMD显卡跑PyTorch
人工智能·pytorch·windows
楷哥爱开发19 小时前
如何在 Windows、macOS 和 Linux 上安装 scikit-learn (sklearn)
linux·windows·macos
2603_9651481119 小时前
eBay商品数据API:寻找海外仓与价格洼地
大数据·人工智能·windows·python·microsoft
江畔柳前堤1 天前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
天天进步20151 天前
UI-TARS 源码解析 #22:二次开发实战:用 UI-TARS 做一个简单的 Windows 自动操作 Agent
windows·ui