c# - Powershell在文件中替换参数

标签 c# powershell

我有一个从 C# 应用程序调用的 Ps 脚本。

正在使用以下格式调用 Powershell 脚本。

            var scriptFile = "./run_script.ps1 " +
                             $"-sql_server {'"' + serverName + '"'} " +
                             $"-database {'"' + dbName + '"'} ";

        MessageBox.Show(scriptFile);

            var startInfo = new ProcessStartInfo
            {
                FileName = @"powershell.exe",
                Arguments = scriptFile,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };

            var process = new Process { StartInfo = startInfo };
            process.Start();

正在从配置文件中读取servername 的值。消息框出现以下字符串

./run_script.ps1 -sql_server "**Server1,5002**" -database "Test"

但是从脚本文件

param ($sql_server,$database)
write-output "The deployment server is $sql_server"

C# 应用程序的输出如下所示

部署服务器是Server1 5002

它正在起飞,对于端口号并将其替换为空白,从而导致SQL连接失败。令人惊讶的是,当从 mo 打印参数时

我不知道可能导致此问题的原因,我已经调试了 C# 应用程序,我可以看到它正在将字符串发送到 Ps 文件,

最佳答案

就您而言,最简单的解决方案是使用 -File CLI显式参数:

Arguments = "-File " + scriptFile

-File 确保除了语法 "..."-引号之外,传递给脚本文件的参数被解释为文字 .

如果没有 -Filepowershell.exe 默认为 -Command/-c,这会导致参数被解释为 PowerShell 命令行,这意味着,在剥离单个参数周围的语法 "..." 引用后,参数以空格连接,生成的命令然后,该行将以与 PowerShell 内部相同的方式进行解释,导致当时未加引号的 **Server1,5002** 被解释为数组

请注意,PowerShell [Core] v6+ ( pwsh ) 现在默认为 -File


因为,正如您在评论中所指出的,您确实需要-Command/-c,因为需要传递实际的array 作为参数之一(-File 不支持),解决方案是使用 '...' 引用您的参数字符串或嵌入 \"...\" - 引用内部您的 "..." 字符串:

var scriptFile = 
  $"./run_script.ps1 -sql_server '{serverName}' -database '{dbName}'";

关于c# - Powershell在文件中替换参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65415541/

相关文章:

c# - dll C# AccessViolationException

c# - 本地化无法正常工作

powershell - "Write-Host"、 "Write-Output"或 "[console]::WriteLine"之间有什么区别?

powershell - 如何在 Windows PowerShell 中进行屏幕捕获?

c# - 带有附加条目的 Gridview

c# - SimpleMembership 更改用户名

powershell - Cmdkey 密码为空

arrays - 从CSV加载两个数组

PowerShell $($a) 有意外结果

c# - 计算处理时间