可以在 Powershell 中呼叫 dll;它需要幾個引數,我必須運行它幾次,而大多數引數保持不變,如下所示:
dotnet C:\App\App.dll AppCmd --MySwitch --Param1 ab --Param2 cd --Param30 xx
dotnet C:\App\App.dll AppCmd --MySwitch --Param1 ab --Param2 cd --Param30 yy
dotnet C:\App\App.dll AppCmd --MySwitch --Param1 ab --Param2 cd --Param30 zz --Param31 x:y y:z
我想'splat'公共引數并手動只寫出每次呼叫的獨特之處,例如:
$CommonArgs = @{
Param1 = 'ab',
Param2 = 'cd'
...
}
dotnet C:\App\App.dll AppCmd --MySwitch --Param30 xx -- @CommonArgs
dotnet C:\App\App.dll AppCmd --MySwitch --Param30 yy -- @CommonArgs
dotnet C:\App\App.dll AppCmd --MySwitch --Param30 zz --Param31 x:y y:z -- @CommonArgs
該應用程式停止抱怨缺少上述語法所需的引數,但它回傳一個錯誤:Unhandled Exception: System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.我不確定該錯誤訊息是來自應用程式還是 Powershell 本身。
我發現在 Powershell 函式中發生了飛濺,我閱讀了--應該將引數傳遞給 dotnet 呼叫,但顯然我仍然遺漏了一些東西。它是什么?
uj5u.com熱心網友回復:
使用哈希表為基礎潑灑與外部程式的作品很少,因為非常特殊的格式轉換的PowerShell散串列項的,:-<key>:<value>-這不會作業你的情況。
對于外部程式,基于陣列的 splatting 是更好的選擇- 事實上,您甚至根本不需要 splatting sigil(@而不是$),您可以按原樣傳遞陣列變數:
$CommonArgs = @( # array, not hashtable
'--Param1', 'ab',
'--Param2', 'cd'
# ...
)
# ...
dotnet C:\App\App.dll AppCmd --MySwitch --Param30 zz --Param31 x:y $CommonArgs y:z
請注意每個引數(無論它表示引數名稱還是值)必須是其自己的陣列元素。
- PowerShell在構建用于在后臺呼叫的命令列時簡單地對陣列元素進行空格連接,并根據需要在帶有嵌入空格的元素周圍應用雙引號。
我省略了
--,因為它將被傳遞給外部程式 - 不確定這是否是意圖(僅對于 PowerShell 原生命令,它會被引數系結器洗掉)。
故障排除提示:
- 該答案的底部顯示了如何構建一個輔助可執行檔案,該可執行檔案可用于回顯給出的確切命令列,以及它如何將其決議為單獨的引數(使用.NET 的決議規則,這些規則基于 Microsoft 的 C /C 編譯器)。
uj5u.com熱心網友回復:
評論太長了,我不知道這是否可行,但也許你可以使用一個小的幫助函式將常用引數從 splatting Hashtable 轉換為命令列語法,如
function Format-CliArguments {
param (
$prefix = '--'
)
$numTypes = 'byte','sbyte','int','int16','int32','int64','uint16','uint32',
'uint64','long','float','single','double','decimal'
$cliCommand = for ($i = 0; $i -lt $args.Count; $i = 2) {
if ($numTypes -contains $args[$i 1].GetType().Name) {
'{0}{1} {2}' -f $prefix, $args[$i].Trim("-:"), $args[$i 1]
}
else {
'{0}{1} "{2}"' -f $prefix, $args[$i].Trim("-:"), $args[$i 1]
}
}
$cliCommand -join ' '
}
# you can make this [ordered]@{..} if the sequence is important
$CommonArgs = @{
Parameter1 = 'ab'
Parameter2 = 123
Parameter3 = 'zz'
}
$standardArgs = Format-CliArguments @CommonArgs
dotnet C:\App\App.dll AppCmd --MySwitch --Param30 xx $standardArgs
dotnet C:\App\App.dll AppCmd --MySwitch --Param30 yy $standardArgs
等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406811.html
標籤:
