web-dev-qa-db-fra.com

Exécuter un fichier .cs C # à partir d'un script PowerShell

J'ai un script PowerShell V2 qui déplace certains fichiers et installe certains services. Toutefois, j'aimerais appeler et exécuter un fichier .cs à peu près à mi-chemin du script PowerShell. J'ai trouvé de nombreux articles sur l'appel de PowerShell à partir de C# mais aucun l'inverse. Je voudrais juste que le fichier C # s'exécute une fois puis continue à exécuter le script PowerShell. 

Si quelqu'un pouvait me diriger vers un article expliquant comment accomplir cela ou si vous vous connaissez et pourriez aider, ce serait grandement apprécié. 

17
Foster

Vous cherchez la mauvaise chose. Placez votre C # dans un assembly et appelez ses classes, fonctions et méthodes publiques depuis PowerShell, comme vous le feriez avec le .NET Framework de Powershell.

Si vous voulez vraiment compiler et exécuter une source C # à partir de PowerShell, voir Weekend Scripter: Exécuter le code C # à partir de PowerShell

8
Robert Harvey

Vous pouvez utiliser Add-Type pour compiler le code C # et l'ajouter à la session PowerShell en cours. Ensuite, vous appelez le code C # comme tout autre code .NET Framework. Voici un exemple tiré du man page sur Add-Type:

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)
25
Keith Hill

Je ne vois aucune raison pour laquelle nous ne puissions pas exécuter un fichier .cs directement à partir de powershell. J'ai donc pris la copie de Keith et ajouté les éléments get-content manquants pour faire littéralement ce que l'OP demande. Pas besoin de compiler votre code, il suffit de modifier le chemin d'accès à votre fichier .cs

$source = Get-Content -Path "A:\basic.cs"
Add-Type -TypeDefinition "$source"
[BasicTest]::Add(4, 3)
$basicTestObject = New-Object BasicTest
$basicTestObject.Multiply(5, 2)

Évidemment, j'ai ajouté cet extrait dans mon 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);
    }
}
24
Knuckle-Dragger

Si vous le souhaitez, vous pouvez exécuter le script c # à partir du fichier * .bat:

  1. créer un script c # (par exemple, Program.cs) avec la méthode public static void Main()
  2. créez un fichier * .bat (par exemple, Run.bat) et placez ce code:
@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. Courir
0
GLeBaTi