我有一个从 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
确保除了语法 "..."
-引号之外,传递给脚本文件的参数被解释为文字 .
如果没有 -File
,powershell.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/