在不打开命令行窗口的情况下直接启动.csx(scriptcs)C#脚本

11

在Windows中是否有一种方法可以直接启动.csx脚本(例如通过双击文件,从开始菜单或通过Launchy等应用程序启动器),以便脚本在后台运行而不会打开命令行窗口?

例如,假设我有一个简单的“lowercase.csx”脚本,它只是获取剪贴板中的任何文本,将其转换为小写,并将结果放回剪贴板。我想能够双击该.csx文件并在完全不打开任何类型窗口的情况下运行。

目前,无论是ScriptCS.exe还是随VS2015 Update 1一起提供的新的csi.exe启动器都会在运行.csx文件时打开控制台窗口,即使该文件没有向控制台输出任何内容。

注意:如果您从控制台窗口启动脚本,则不会打开新窗口。我想在非命令行上下文中启动脚本,并且它不会打开任何窗口。

注意2:在“CS-Script”中(ScriptCS替代品)实现我所需的相当于是使用“csws.exe”启动文件。


1
为什么不在 CSX 文件旁边创建一个批处理文件,里面写上 "ScriptCS [CSX 文件名].csx" 呢?然后你双击批处理文件,就可以运行 csx 文件了。 - Thundter
4个回答

3
你可以制作自己的csi.exe版本,该版本可以在没有控制台的情况下运行。
只需创建一个新项目,确保类型设置为WinForms而不是Console,然后从NuGet添加C#脚本包,并复制粘贴csi.exe源代码即可。

所以这个确实可以工作,但你不能只是复制粘贴csi.exe的源代码,因为它依赖于来自roslyn的其他内部类。你可以通过克隆整个Roslyn源代码仓库并将csi项目的输出类型更改为“Window”,然后你就可以获得一个看起来可以在没有窗口的情况下运行脚本的csi.exe。不过,这似乎是一种有点糟糕的方法;理想情况下应该有一种官方支持的方法来完成这个。 - ivanatpr
@ivanatpr:在GitHub上提交一个功能请求,将那些类公开。 - SLaks

2

2

一种解决方法是创建自己的程序,以后台方式启动它,就像csws.exe一样。

首先创建一个控制台应用程序。

public static void Main(string[] args)
{
    var startInfo = new ProcessStartInfo("path to csi.exe")
    {
        CreateNoWindow = true,
        Arguments = args[1],
        RedirectStandardOutput = true,
        UseShellExecute = false,
    };
    Process.Start(startInfo);
}

(显然,你需要传递其余的参数并检查是否传递了文件等,但这应该可以帮助你入门。我在我的Mac上编写了这个答案,因为我的Windows电脑正在维修中,所以不能保证它能正常工作。)
然后,通过在项目属性屏幕上将控制台应用程序从控制台应用程序更改为Windows应用程序来使控制台应用程序不显示窗口,如此问题中所述。
最后,配置.csx文件始终使用您的应用程序打开。然后,您可以双击它们,它们将在没有窗口的情况下运行。

1
您也可以直接运行脚本;复制http://source.roslyn.io/#csi/Csi.cs,16 - SLaks

0
创建一个批处理文件并添加以下内容(在此示例中为安装在VS 2019上的csi.exe):
@echo off
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Roslyn\csi.exe" "C:\myscript.csx"

如果隐藏命令提示符很重要,那么请参见这里这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接