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#アプリケーションからの出力は以下にあります
展開サーバーはServer15002です
ポート番号が削除され、空のスペースに置き換えられているため、SQL接続が失敗します。驚くべきことは、パラメータがmoから出力されるときです
これを引き起こしている可能性があるものがわからなくなったので、C#アプリケーションをデバッグしました。これにより、文字列がPsファイルに送信されていることがわかります。
あなたの場合、最も簡単な解決策は、-File
CLIパラメーターを明示的に使用することです。
Arguments = "-File " + scriptFile
-File
構文"..."
引用はさておき、スクリプトファイルに渡される引数がリテラルとして解釈されることを保証します。
がない-File
場合、powershell.exe
デフォルトは-Command
/-c
になります。これにより、引数はPowerShellコマンドラインとして解釈されます。つまり、"..."
個々の引数の構文引用符を取り除いた後、引数はスペースで連結され、結果のコマンドラインは同じように解釈されます。 PowerShellの内部からであるため、引用符で囲ま**Server1,5002**
れていないものは配列として解釈されます。
PowerShell [Core] v6 +(pwsh
)のデフォルトが-File
。になっていることに注意してください。
コメントで指摘しているように、引数の1つとして実際の配列を渡す必要があるため(サポートされていません)、/が必要なので、解決策は引数文字列に引用符を使用するか、-を埋め込むことです。引用の内側にあなたの文字列:-Command
-c
-File
'...'
\"...\"
"..."
var scriptFile =
$"./run_script.ps1 -sql_server '{serverName}' -database '{dbName}'";
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加