請把不聽話的【return】關進【class】這個籠子

来源:http://www.cnblogs.com/piapia/archive/2016/02/27/5223064.html
-Advertisement-
Play Games

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。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上個示例是C#調用windows api在原來代碼上加入窗體透明,控制項不透明代碼: 1 using System; 2 using System.Runtime.InteropServices; 3 using System.Windows.Forms; 4 5 namespace HoverTre
  • 展示層由Ninesky.Web項目實現,負責網站內容的顯示,項目包含Member和Control兩個區域。 Member區域實現網站內容的管理,Control區域實現網站系統管理。結構、功能圖如下: 一、Member區域 1、添加Member區域 Ninesky.Web【右鍵】-> 添加->區域 。...
  • 閱讀目錄基本用法高級用法 本文主要是我在項目中對C#枚舉的使用心得,如有不足的地方歡迎您指出。一、基本介紹  枚舉是由一組特定常量構成的一組數據結構,是值類型的一種特殊形式,當需要一個由指定常量集合組成的數據類型時,使用枚舉類型。枚舉聲明可以顯式地聲明 byte、sbyte、short、us
  • 有文檔,但是,寫文檔的人明白,看文檔的人很有難度。 沒有SDK,要自已寫。 然後,錢的流入流出都必須經過虛擬錢包,提現還要綁取現卡,這個我也能理解,不能理解的是,訂單退款,為什麼要退到虛擬錢包,這個時候要程式來幫用戶綁取現卡,可是這不是用戶主動操作呀。要有密碼呀。可是我們沒有存用戶的密碼呀。 就接了
  • 第一章什麼是xml 電腦里的數據文件分為倆大類,二進位文件和文本文件。 二進位文件是一個比特流(1或0系列),只有創建二進位的應用程式才會理解這個比特流的實際含義。 文本文件也是比特流,文本文件里的比特流是以一種標準格式組織起來的,因此他們總是組成一個個數,每個數再映射為字元。 標記語言的簡史 探
  • 本文分別對Cookie與Session做一個介紹和總結,並分別對兩個知識點進行對比分析,讓大家對Cookie和Session有一個更深入的瞭解,並對自己的開發工作中靈活運用帶來啟示。 cookie機制 Cookies是伺服器在本地機器上存儲的小段文本並隨每一個請求發送至同一個伺服器。IETF RFC
  • 關於這份指南 之前有不少學弟學妹問我如何學習編程,根據DRY法則(Don't Repeat Yourself),還是把自己學習過程中的一些經驗整理成一篇博客吧。由於本人目前也處在學習的階段,文章中列出來的內容也並未全部學習過,所以文章的客觀性可能存在一些問題,還望讀者自行判斷。 這份指南會不定期更新
  • 多少年來,許多的編程語言和工具都包含對正則表達式的支持,.NET基礎類庫中包含有一個名字空間和一系列可以充分發揮規則表達式威力的類,而且它們也都與未來的Perl 5中的規則表達式相容。 此外,regexp類還能夠完成一些其他的功能,例如從右至左的結合模式和表達式的編輯等。 在這篇文章中,我將簡要地介
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...