我遇到了一個腳本,它使用點源運算子來混淆其呼叫。
$ORMEFyak=.('n' 'ew-obje' 'ct') NeT.WebcLIENt;
這似乎相當于:
$var = New-Object Net.WebClient
運行. "help"回傳helpcmdlet的內容。
為什么點源運算子會這樣?
uj5u.com熱心網友回復:
該行為不特定于.,點源運算子;它同樣適用于&,呼叫運算子。
只有當你呼叫腳本檔案(
*.ps1)(或較不常見的,功能或腳本塊)做.和&表現不同:.運行該代碼直接在呼叫者的范圍,而&,這是比較典型的,運行它在一個子范圍-有關更多資訊,請參閱此答案。對于
New-Object,作為cmdlet,您可以在技術上互換使用它們(或完全省略它們 - 見下文),但為了概念清晰,最好使用,&除非需要實際的點源。
它們并不是將字串轉換為命令,而是它們的目的是執行由名稱給出的命令,作為字串,以及其他形式(見下文)。
在特定的語法用于提供或用于構建該名稱.或&是偶然的,并且在你的情況下,使用模糊被呼叫的命令的名稱的字串-級聯表達。
- 但是,指定不帶引號的命令名稱,逐字逐句(如果在語法上可能)是特殊的,因為您可以在沒有運算子的情況下呼叫-
&然后是隱含的;請參閱下面的示例。
因此,以下所有變體都是等效的(出于上述原因,我正在使用&):
# Bareword (unquoted, verbatim) command name
# If you don't need dot-sourcing, you can invoke *as-is* -
# use of & is implied.
New-Object regex 'foo?'
# Optionally, use &
& New-Object regex 'foo?'
# If the command name *needs quoting*, is *(based on) a variable* or
# *built by an expression*, & is *required*
$cmd = 'New-Object'
& $cmd regex 'foo?'
& ('New-' 'Object') regex 'foo?'
需要注意的是,除了作用于命令名稱(字串),.并且&還可以呼叫腳本塊(例如& { New-Object regex 'foo?' })和命令-資訊物件被回傳Get-Command(如& (Get-Command New-Object) regex 'foo?')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/346007.html
