powershell的return使用方法研究,案例詳解。
請把不聽話的【return】關進【class】這個籠子
問:powershell 最垃圾的語句是什麼?
答:(函數中的)return
#例子1:函數中的return有時會返回所有內容,而不是你想要的內容,如: function aaa { return 'bbb' } function ccc { aaa return 'ddd' } ccc #ccc函數不光返回了我們想要的值ddd,還把aaa函數的返回值bbb返回了。
-----------------我們心目中return的作用--------------------
我們用return想實現2個功能:
1 只返回1---n 個,我們想要的結果。
2 結束當前函數。-----這個功能可以用空的return來實現。
總之,不建議在函數中,用return後面加變數返回內容。
---------------解決方案1---------------
函數中有return,函數中又用了.net方法的情況。請在.net方法前加[void],這樣就不會帶出多餘數據。
powershell 傳教士 原創文章 2014-07-18 2014-10-10 2015-03-22 2016-02-27更新,允許轉載,但必須保留名字和出處,否則追究法律責任
---------------解決方案2 貌似不靈---------------
使用
return ,$我想要的返回值
或
return @(,$我想要的返回值)
---------------解決方案3 在函數外面,用 -is [array]判斷返回值是單一,還是多個。推薦 ---------------
#例子2: if ($函數名 -is [array]) { $我想要的返回值 = $函數名[-1] } else { $我想要的返回值 = $函數名 }
---解決方案3變種,既然返回值或許是數組,那麼就可以取第一個,或最後一個值---
#例子3:有個缺點,必須明確知道返回值個數才行。 function 函數a { $a = 1 $b = 2 $c = 3 return $a,$b,$c } $d,$e,$f = 函數a #函數返回的值,我全要 $g,$null,$null = 函數a #我只想要函數返回的第一個值 $null,$null,$h = 函數a #我只想要函數返回的最後一個值 write-host $d,$e,$f,$g,$h
---------------解決方案4 diy,直接寫入外部變數---------------
不用return,而用自定義的return2函數,和自定義變數$global:return2保存要返回的內容。
#例子4:直寫外部變數 function return2($youwant) { $global:return2 = $youwant } function aaa { return 'aaa' } function bbb { aaa return2 'bbb' #把返回值寫入,或者直接寫變數$global:return2 = 'bbb' return write-host "運行不到這裡" } write-host $global:return2 #輸出 $ccc = $global:return2 #讀取
------------------------------------------------------------------
#例子5:直寫外部變數變種,給函數傳入【輸出外部變數】 function 函數a($輸入變數值,$輸出變數名_一個不帶s的字元串) { $輸出變數值 = $輸入變數值 + 1 # 這裡或許有 if Set-Variable -Name $輸出變數名_一個不帶s的字元串 -Value $輸出變數值 return #這裡或許有 endif write-host "如果沒有if,將運行到這裡" } 函數a 8 "script:aaa" $script:aaa #--------------------返回 9,即 8 + 1
--------------------------------------------
結論: (函數中的return有壞的特性)
凡是函數中,又調用其他函數,其他函數也有返回值;
凡是函數中有$aaa這樣,把值列印到屏幕的;
凡是函數中有write-output $aaa列印屏幕的;
用了return 都會有問題。
---------------解決方案5 把不聽話的【return】關進這個【class】籠子 推薦 ---------------
ps 5.0 類的關鍵字:
hidden 不想被別人用的隱藏屬性
static 靜態關鍵字
$this 本類的對象
powershell5.0 中的 class 類的研究:
1 類中不能 function xxx {}這樣定義函數 。只能定義方法。
2 類中不能調用ps命令,不能調用ps函數。只能定義方法,併在方法中用命令,然後用return 返回數據。
3 類中可以用$a=5,但不能用$a=5;$a。
4 類中可以用$a=[aaa]::bbb(),但不能用[aaa]::bbb() 。
5 函數中可以定義類。
6 類名,類的屬性名,類的方法名,都可以是中文。
7 類如果不用new新建,就不能調用其中的方法,除非方法帶有 static (靜態方法)首碼。類如果不用new新建,就不能使用其中的屬性,除屬性帶有 static (靜態變數)首碼。
類引發的好處:
由上述2可知,你不能在類的方法中用write-host,write-output等命令,【直接!】輸出數據。
由上述3,4可知,類的方法不會【直接輸出值!】,即不會返回【不想要的多餘】數據。
類中沒有函數中return的壞特性。
#例子6:把return關入class,編寫不會返回多餘數據的腳本。例子6,實際上是 例子1 的class化改寫。 function aaa { return 'bbb' } class ccc { static [string]ddd() { aaa return 'ddd' } } [ccc]::ddd()
結論:
不想要多餘的數據?用class改寫你的function。