从PowerShell脚本中运行C# .cs文件

33

我有一个 PowerShell V2 脚本,用于移动一些文件并安装一些服务。然而,我想在 PowerShell 脚本运行到一半时调用并运行 .cs 文件。我找到了很多关于从 C# 调用 PowerShell 的文章,但没有相反的方法。我只希望 C# 文件能够运行一次,然后继续运行 PowerShell 脚本。

如果有人能指点我如何完成这个任务的文章或者您自己知道并能提供帮助,那将不胜感激。


1
你不能“运行.cs文件”……它不是脚本。它将成为一个更大的项目的一部分,可能是控制台或WPF应用程序。您能否提供有关该文件及其所属内容的更多详细信息? - tnw
是的,抱歉,这是一个“控制台应用程序”,它编辑我拥有的一个“XML”文件。它主要只是更改XML文件中的文本,没有太复杂的操作。它只有一个名为“class1”的类。 - Foster
2
那么为什么不直接调用/运行已编译的可执行文件呢?如果它需要参数,你可以给它传递参数。 - tnw
这个例子可能会有所帮助 在 Powershell 脚本中使用 CSharp (C#) 代码 - Roman
1
你应该了解一下 scriptCS。它允许你使用 PowerShell 运行 *.cs 文件。你可以在这里找到更详细的信息:http://scriptcs.net/。 - kravasb
5个回答

52

我认为我们完全可以直接从PowerShell运行.cs文件,因此我采用了Keith的代码片段,并添加了缺少的Get-Content部分,以实现OP所要求的字面意思。 无需编译您的代码,只需编辑-Path参数以指向您的.cs文件。

$source = Get-Content -Path "A:\basic.cs"
Add-Type -TypeDefinition "$source"

# Call a static method
[BasicTest]::Add(4, 3)

# Create an instance and call an instance method
$basicTestObject = New-Object BasicTest
$basicTestObject.Multiply(5, 2)

Basic.cs

public class BasicTest
{
    public static int Add(int a, int b)
    {
        return (a + b);
    }

    public int Multiply(int a, int b)
    {
        return (a * b);
    }
}

6
Get-Content 可能需要使用 -Raw 参数。 - StingyJack
1
我也复制错了。如果您使用他们的代码并将其字符串化,则不需要-Raw"$source" - Carl Walsh
1
使用Get-Content命令时,加上-Raw参数并将结果直接传递给变量应该更可靠。 - Ben Philipp

34

您可以使用Add-Type来编译C#代码并将其添加到当前的PowerShell会话中。然后,您就可以像调用其他.NET框架代码一样调用C#代码。以下是来自man页面的示例:

PS C:\>$source = @"
public class BasicTest
{
  public static int Add(int a, int b)
    {
        return (a + b);
    }
  public int Multiply(int a, int b)
    {
    return (a * b);
    }
}
"@

PS C:\>Add-Type -TypeDefinition $source
PS C:\>[BasicTest]::Add(4, 3)
PS C:\>$basicTestObject = New-Object BasicTest
PS C:\>$basicTestObject.Multiply(5, 2)

1
我在运行于MacOS上的Powershell Core v.7.1.4中尝试了这个Add-Type示例(原帖提问的是关于Powershell V2的),今天仍然非常有效。 - George D Girton

9
你在寻找错误的东西。将你的C#放入一个程序集中,然后从PowerShell调用它的公共类、函数和方法,就像你从Powershell调用.NET Framework一样。
如果你真的想要从PowerShell编译和运行C#源代码,请参考Weekend Scripter: Run C# Code from Within PowerShell

0

如果您想的话,可以从*.bat文件运行c#脚本:

  1. 创建一个带有public static void Main()方法的c#脚本(例如Program.cs)
  2. 创建一个*.bat文件(例如Run.bat),并放置以下代码:
@ECHO off
Echo Please run as administrator
setlocal
cd /d %~dp0
set csDir=%cd%\Program.cs
powershell ^
set-executionpolicy remotesigned; ^
$source = Get-Content -Raw -Path %csDir%; ^
Add-Type -TypeDefinition "$source"; ^
[Program]::Main()
  1. 运行

0

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