You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PowerShell脚本(.ps1)转换为字符串格式以便嵌入C#代码?

Embedding PowerShell Scripts into C# String Variables

Great question—embedding your PowerShell script directly into a C# string is a smart way to eliminate path-related headaches across different machines or user environments. Here are several practical methods to get this done smoothly:

1. Manual Escaping (Best for Short Scripts)

If your .ps1 script is short, manual conversion works perfectly—you just need to handle a few key escape rules:

  • Replace double quotes (") with two double quotes ("") when using a verbatim string (prefixed with @), or escape them with a backslash (\") for regular strings.
  • Escape backslashes (\) with an extra backslash (\\) in regular strings (verbatim strings skip this step entirely).

Example:
Original PowerShell script:

Get-ChildItem -Path "C:\Temp" | Select-Object Name

Converted C# strings:

// Regular string (requires escaping quotes and backslashes)
string psScript = "Get-ChildItem -Path \"C:\\Temp\" | Select-Object Name";

// Verbatim string (cleaner, no backslash escape needed)
string psScriptVerbatim = @"Get-ChildItem -Path ""C:\Temp"" | Select-Object Name";

2. Multi-Line Verbatim Strings (Best for Long Scripts)

For longer scripts, use C#'s multi-line verbatim strings to preserve your original script formatting without tedious manual escaping:

  • C# 11+: Use raw string literals (""") which let you paste the script directly with zero escaping required.
  • Older C# versions: Use a verbatim string (@) and replace all single double quotes with two.

Example:

// C# 11+ Raw String Literal (most convenient option)
string longPsScript = """
$files = Get-ChildItem -Path "C:\Temp"
foreach ($file in $files) {
    Write-Host "Found file: $($file.Name)"
}
""";

// Legacy C# Multi-Line Verbatim String
string longPsScriptLegacy = @"
$files = Get-ChildItem -Path ""C:\Temp""
foreach ($file in $files) {
    Write-Host ""Found file: $($file.Name)""
}
";

3. Auto-Conversion with a Quick PowerShell Script

To skip manual work entirely, write a tiny PowerShell helper script to convert your .ps1 file into a ready-to-paste C# string:

# Replace "your-script.ps1" with your actual script path
$scriptContent = Get-Content -Path "your-script.ps1" -Raw
# Wrap the content as a C# verbatim multi-line string
$csharpString = '@"' + "`n" + $scriptContent.Replace('"', '""') + "`n" + '"'
# Save to a text file for easy copying
$csharpString | Set-Content -Path "script-as-csharp-string.txt"

Run this script, open the output text file, and the content is ready to paste directly into your C# code.

4. Embed as a Project Resource (Alternative Approach)

If you want to keep your .ps1 file intact for easy editing but avoid path issues, embed it as a project resource:

  1. Add your .ps1 file to your C# project.
  2. Right-click the file → Properties → Set Build Action to Embedded Resource.
  3. Read the resource in code:
using System.IO;
using System.Reflection;

var assembly = Assembly.GetExecutingAssembly();
// Replace with your namespace + script filename (e.g., "MyProject.Scripts.Backup.ps1")
var resourceName = "YourNamespace.YourScript.ps1";

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
    string psScript = reader.ReadToEnd();
    // Use the script string as needed
}

Bonus: Executing the Embedded Script

To run the embedded PowerShell script in C#, use the Microsoft.PowerShell.SDK NuGet package:

using System.Management.Automation;

var powerShell = PowerShell.Create();
powerShell.AddScript(psScript);
var results = powerShell.Invoke();

// Handle results or errors
if (powerShell.HadErrors)
{
    foreach (var error in powerShell.Streams.Error)
    {
        Console.WriteLine($"Error: {error.Message}");
    }
}

内容的提问来源于stack exchange,提问作者Shorty Beast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:12:41