我讀過這個,但它沒有解決我的問題。
我有一個空格分隔的字串,比方說$MyString = "arg1 arg2"。假設我有一個名為MyProgram的命令列程式,它接受任意數量的位置引數,所以它可以像MyProgram arg1 arg2那樣運行。然而,運行MyProgram $MyString并不奏效,MyProgram ($MyString -split ' ')和MyProgram $($MyString -split ' ')也是如此。我得到了同樣的錯誤,基本上說它沒有識別引數 "arg1 arg2",我猜這是因為它仍然認為這是一個包含空格的引數,而不是兩個引數。在實踐中,$MyString可能相當巨大,而且是從檔案中讀取的。我怎樣才能使其正常作業呢?
uj5u.com熱心網友回復:
哦,我剛剛發現了如何LOL。我應該早點想到的;基本上,只要使用splatting就可以了,下面的方法對我來說很有效:
$MyArray = $($MyString -split " "/span>)
MyProgram @MyArray
解釋一下。第一行將字串轉換為由空格("")分割的字串陣列;命令周圍的$(...)符號捕捉了命令的輸出,然后我將其分配給$MyArray。然后,我不使用$MyArray的美元符號$,而是用@將字串陣列拼成MyProgram的引數。
uj5u.com熱心網友回復:
tl;dr
對于呼叫PowerShell命令,你確實需要splatting,以便將陣列的元素作為單獨的、位置性的引數傳遞;這需要在輔助變數中定義陣列,然后可以用sigil @代替$來請求拼接:
$myArray = -split $myString # See below for limitations, bottom section for fix
MyPowerShellCommand @myArray # 陣列元素作為獨立的引數被傳遞。
雖然這種技術也可以與外部程式一起使用,但在那里并不是嚴格必要的,你可以直接傳遞一個陣列來達到同樣的效果:
MyExternalProgram (-split $myString) # Array elements are passed as indiv. args.
注意(...)而不是$(...)來傳遞運算式作為一個引數。(...)通常是足夠的,而且通常是最好的,因為$(...)可能有副作用--詳情請參見本答案。
首先,要明確的是:由于只用空格分割,這兩個答案都不能正確處理引數串列字串中帶有嵌入式空格的引數(因此,必須使用嵌入式引號),例如,$myString = "arg1 `"arg2 with spaces`" arg3"將不能如期作業 - 參見底部章節的解決方案。
撇開這個不談,區別在于:
當呼叫一個外部程式時,如鏈接的帖子中,傳遞一個陣列導致每個元素成為自己的引數。
- 也就是說,
myExternalProgram (-split $MyString)就可以了。 - 注意,我使用
-split運算子的單數形式來進行更靈活的標記化,它通過任何非空運行的空白來進行分割,同時忽略前導和尾部的空白(與awk的默認行為相同)。
- 也就是說,
當呼叫PowerShell命令時,就像你的情況一樣,陣列默認是作為一個單一引數傳遞原樣。
為了達到與外部程式相同的效果,即將陣列的元素作為單獨的、有位置的引數來傳遞,你確實必須使用splatting,即你必須:
- 將陣列保存在一個名為 "S "的檔案中。
- 先將陣列保存在一個變數中。
$myArray = -split $myString, - 然后你可以通過使用
@而不是$作為符號,將其作為一個splitted引數傳遞。MyPowerShellCommand @myArray
請注意,在呼叫PowerShell命令時更常見--也更穩健--使用hashtable- 而不是基于陣列的拼接,因為它允許你明確地按名稱而不是按位置系結引數- 而PowerShell命令往往有一些引數只能按名稱系結。
- 例如,如果
MyPowerShellCommand接受引數-Foo和-Bar,你可以使用:
$myArgs = @{ Foo='foo value'; Bar='bar value' }; MyPowerShellCommand @myArgs
- 例如,如果
如果你想處理引數串列中的引數帶有內嵌空格,那么你就需要在引數串列中添加空格。
如果你確實想處理引數串列字串中帶有嵌入式空格的引數:
$myString = "arg1`"/span>arg2 with spaces`" arg3"
$myArray = (Invoke-Expression ('Write-Output -- ' $myString -replace '$', "`0")) -replace "`0", '$$'。
注意:Invoke-Expression (iex)一般應避免使用,但在這個特殊命令中采取的額外預防措施使其使用安全。
$myArray然后是一個3元素的陣列,逐字元素arg1,arg2帶空格和arg3,可以再次如上所示使用。
參見本答案以了解該技術的解釋。
uj5u.com熱心網友回復:
這些對我有用($args是保留的)。 左邊的-split會在空白處進行分割。 或者你可以從一個檔案中獲取內容,每個引數都在一個單獨的行中。 你可能會遇到一個命令列可以有多長的限制。 通過管道將該串列輸入或從檔案中加載可能是一個更好的方法。
echo hi > file.txt
$args2 = 'hi'/span>,'file.txt'/span>
findstr $args2
# hi
$args2 = 'hi','file.txt'。
& findstr $args2
# hi
$args2 = 'hi file.txt'/span>
findstr (-split $args2)
# hi
findstr ($args2 -split ' '/span>)
# 喜
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/307873.html
標籤:
