PowerShell自定義對象詳解

什么是對象

在面向?qū)ο缶幊痰念I(lǐng)域有一句話叫:萬事萬物皆為對象啤誊。

我們生活中的每一件東西都可以看作是一個對象饺窿,包括我們本身都是一個對象鲫咽。

這是一種抽象的思想姨伤,我們將一件事物提取出特征和行為劫恒,將特征定義為屬性贩幻,將行為封裝成方法酒甸。

對象在程序開發(fā)中的概念可以說都一樣胖齐。

對象通常有自己的屬性和方法,比如一個人徒溪,它的屬性有膚色 /身高/ 性別 等憔辫,方法有 走路 /躺下 /呼喊/吃飯/睡覺/打豆豆 等趣些。

什么是PowerShell對象

在powershell中提供了對對象的定義方法;使用這樣的方法創(chuàng)建的變量就是powershell對象贰您。

PowerShell是基于面向?qū)ο蠡幕灯剑幌駛鹘y(tǒng)的shell那樣基于文本。這其中最主要的原因就是因為Win平臺在管理操作上主要以面向?qū)ο鬄橹鹘跻啵虼藶榱朔舷到y(tǒng)特點和我們的操作習(xí)慣功茴,PowerShell也繼承了這一特色。因此孽亲,不像傳統(tǒng)的shell坎穿,在PowerShell中,我們可以隨意地與對象進(jìn)行互動返劲。

1.創(chuàng)建

PS C:\Users\Administrator> $aa = New-Object object
PS C:\Users\Administrator> $aa.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object


PS C:\Users\Administrator> $aa | Get-Member *


 TypeName:System.Object

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()


PS C:\Users\Administrator>

2.添加屬性:方法1

PS C:\Users\Administrator> $aa | Add-Member -MemberType NoteProperty -Name "Name" -Value "Jack"
PS C:\Users\Administrator> $aa

Name
----
Jack


PS C:\Users\Administrator> $aa | Get-Member *


 TypeName:System.Object

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Name        NoteProperty string Name=Jack


PS C:\Users\Administrator>

3.添加屬性:方法2

PS C:\Users\Administrator> Add-Member -InputObject $aa -MemberType NoteProperty -Name "Language" -Value "Powershell"
PS C:\Users\Administrator> $aa | Get-Member *


 TypeName:System.Object

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=Powershell
Name        NoteProperty string Name=Jack


PS C:\Users\Administrator> $aa

Name Language
---- --------
Jack Powershell


PS C:\Users\Administrator>

4.添加方法

PS C:\Users\Administrator> $aa | Add-Member -MemberType ScriptMethod -Name "sayhello" -Value { write-host "hello" }
PS C:\Users\Administrator> $aa | Get-Member *


 TypeName:System.Object

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=Powershell
Name        NoteProperty string Name=Jack
sayhello    ScriptMethod System.Object sayhello();


PS C:\Users\Administrator> $aa.sayhello()
hello
PS C:\Users\Administrator>
PS C:\Users\Administrator> $S = { $this.Name.ToUpper() }
PS C:\Users\Administrator> $aa | Add-Member -MemberType ScriptMethod -Name "UpperMyName" -Value $S
PS C:\Users\Administrator> $aa

Name Language
---- --------
Jack Powershell


PS C:\Users\Administrator> $aa.UpperMyName()
JACK
PS C:\Users\Administrator>
PS C:\Users\Administrator> $word = "Goodbye!!!"
PS C:\Users\Administrator> $sayword = { Write-Host $word }
PS C:\Users\Administrator> $aa | Add-Member -MemberType ScriptMethod -Name "sayBye" -Value $sayword
PS C:\Users\Administrator> $aa.sayBye()
Goodbye!!!
PS C:\Users\Administrator>

傳參(注意$this和傳入?yún)?shù)的調(diào)用)

$block = {
 param(
 $var
 )
 $result = "{0},{1} I'm {2}" -f $var,"hello world!!",$this.Name
 return $result
}
$aa | Add-Member -MemberType ScriptMethod -Name "sayAnything" -Value $block

PS C:\Users\Administrator> $aa | Add-Member -MemberType ScriptMethod -Name "sayAnything" -Value $block
PS C:\Users\Administrator> $aa.sayAnything("Tom")
Tom,hello world!! I'm Jack
PS C:\Users\Administrator>

若下個驗證代碼塊是否可以正常運行可以使用:

PS C:\Users\Administrator> &$block
,hello world!!
PS C:\Users\Administrator>

或者

PS C:\Users\Administrator> &$block -var "qq"
qq,hello world!!
PS C:\Users\Administrator>

5.移除方法

PS C:\Users\Administrator> $aa | Get-Member


 TypeName:System.Object

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=Powershell
Name        NoteProperty string Name=Jack
sayAnything ScriptMethod System.Object sayAnything();
sayBye      ScriptMethod System.Object sayBye();
sayhello    ScriptMethod System.Object sayhello();
UpperMyName ScriptMethod System.Object UpperMyName();


PS C:\Users\Administrator> $aa.PsObject.Members.Remove("sayAnything")
PS C:\Users\Administrator> $aa | Get-Member


 TypeName:System.Object

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=Powershell
Name        NoteProperty string Name=Jack
sayBye      ScriptMethod System.Object sayBye();
sayhello    ScriptMethod System.Object sayhello();
UpperMyName ScriptMethod System.Object UpperMyName();


PS C:\Users\Administrator>

什么是PowerShell自定義對象

自定義對象可以完全根據(jù)自己的設(shè)計玲昧,定義對象的屬性和方法。

PowerShell自定義對象有什么作用

自定義對象可以更符合使用者的要求篮绿,因為他的屬性和方法完全由使用者自己定義設(shè)定孵延;比默認(rèn)的對象更加靈活。自己創(chuàng)建的自定義對象完完全全根據(jù)自己的意愿賦予屬性和方法亲配,可以完全做到獨一無二尘应。

PowerShell自定義對象的常見用法

1.創(chuàng)建自定義對象

tips:需要powershell 3.0及以上版本

$myObject = [PSCustomObject]@{
 Name = 'Kevin'
 Language = 'PowerShell'
 State    = 'Texas'
}
##創(chuàng)建
PS C:\WINDOWS\System32> $myObject = [PSCustomObject]@{
>> Name = 'Kevin'
>> Language = 'PowerShell'
>> State    = 'Texas'
>> }
PS C:\WINDOWS\System32>

##查看
PS C:\WINDOWS\System32> $myObject

Name  Language   State
----  --------   -----
Kevin PowerShell Texas

##查看屬性
PS C:\WINDOWS\System32> $myObject.name
Kevin
PS C:\WINDOWS\System32>

上面這些利用hashtable也能實現(xiàn)基本一樣的效果,那我們來做下對比:

$myHashtable = @{
 Name = 'Kevin'
 Language = 'PowerShell'
 State    = 'Texas'
}

##創(chuàng)建
PS C:\WINDOWS\System32> $myHashtable = @{
>> Name = 'Kevin'
>> Language = 'PowerShell'
>> State    = 'Texas'
>> }
PS C:\WINDOWS\System32>
#查看
PS C:\WINDOWS\System32> $myHashtable

Name                           Value
----                           -----
Name                           Kevin
Language                       PowerShell
State                          Texas


##查看屬性
PS C:\WINDOWS\System32> $myHashtable.Name
Kevin
PS C:\WINDOWS\System32>

2.自定義對象 vs. HashTable

類型不同

PS C:\WINDOWS\System32> $myObject.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object


PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $myHashtable.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Hashtable                                System.Object


PS C:\WINDOWS\System32>

可用的方法不同

PS C:\WINDOWS\System32> $myHashtable.Count
3
PS C:\WINDOWS\System32> $myObject.Count
PS C:\WINDOWS\System32>

Member大大不同

##查看Member
PS C:\WINDOWS\System32> $myObject | Get-Member


 TypeName:System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=PowerShell
Name        NoteProperty string Name=Kevin
State       NoteProperty string State=Texas

##利用select
PS C:\WINDOWS\System32> $myObject | select name

Name
----
Kevin


PS C:\WINDOWS\System32>



##查看Member
PS C:\WINDOWS\System32> $myHashtable | Get-Member


 TypeName:System.Collections.Hashtable

Name              MemberType            Definition
----              ----------            ----------
Add               Method                void Add(System.Object key, System.Object value), void IDictionary.Add(System.Object key, System.Object value)
Clear             Method                void Clear(), void IDictionary.Clear()
Clone             Method                System.Object Clone(), System.Object ICloneable.Clone()
Contains          Method                bool Contains(System.Object key), bool IDictionary.Contains(System.Object key)
ContainsKey       Method                bool ContainsKey(System.Object key)
ContainsValue     Method                bool ContainsValue(System.Object value)
CopyTo            Method                void CopyTo(array array, int arrayIndex), void ICollection.CopyTo(array array, int index)
Equals            Method                bool Equals(System.Object obj)
GetEnumerator     Method                System.Collections.IDictionaryEnumerator GetEnumerator(), System.Collections.IDictionaryEnumerator IDictionary.GetEnumerator(), System.Collections.IEnume...
GetHashCode       Method                int GetHashCode()
GetObjectData     Method                void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISerializable.GetObj...
GetType           Method                type GetType()
OnDeserialization Method                void OnDeserialization(System.Object sender), void IDeserializationCallback.OnDeserialization(System.Object sender)
Remove            Method                void Remove(System.Object key), void IDictionary.Remove(System.Object key)
ToString          Method                string ToString()
Item              ParameterizedProperty System.Object Item(System.Object key) {get;set;}
Count             Property              int Count {get;}
IsFixedSize       Property              bool IsFixedSize {get;}
IsReadOnly        Property              bool IsReadOnly {get;}
IsSynchronized    Property              bool IsSynchronized {get;}
Keys              Property              System.Collections.ICollection Keys {get;}
SyncRoot          Property              System.Object SyncRoot {get;}
Values            Property              System.Collections.ICollection Values {get;}

##利用select
PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $myHashtable | select Name

Name
----



PS C:\WINDOWS\System32>

注意:對于hashtable而言吼虎,我們的例子中演示的結(jié)果雖然也能通過$myHashtable.Name顯示出與$myObject.Name一樣的結(jié)果犬钢;但是,$myHashtable.Name真正的寫法應(yīng)該是$myHashtable.Item("Name")

因為hashtable僅僅是鍵值對思灰,所以無法通過使用Format-TableExport-CSVSelect的方法對數(shù)據(jù)進(jìn)行處理玷犹。

3.HashTable轉(zhuǎn)換成PSCustomObject

PS C:\WINDOWS\System32> $myHashtable = @{
>>     Name     = 'Kevin'
>>     Language = 'PowerShell'
>>     State    = 'Texas'
>> }
>> $myObject = [pscustomobject]$myHashtable
PS C:\WINDOWS\System32> $myObject

Name  Language   State
----  --------   -----
Kevin PowerShell Texas


PS C:\WINDOWS\System32>

注意:強烈建議如果在需要使用自定義對象的情況時從一開始使用;因為像這種從hashtable轉(zhuǎn)換的PSCustomObject洒疚,實際上肯惡搞并不完全保障對象屬性的順序歹颓。

當(dāng)然坯屿,這種情況目前可以通過[ordered]@()來解決,但這不時本片文章的討論重點巍扛。

將哈希表保存到文件的最佳方法是將其保存為 JSON领跛。 可以將其導(dǎo)入回 [PSCustomObject]

$myObject | ConvertTo-Json -depth 1 | Set-Content -Path $Path
$myObject = Get-Content -Path $Path | ConvertFrom-Json

4.歷史遺留問題

$myHashtable = @{
 Name     = 'Kevin'
 Language = 'PowerShell'
 State    = 'Texas'
}

$myObject = New-Object -TypeName PSObject -Property $myHashtable

老版本的powershell使用上述方法創(chuàng)建自定義對象;但這種方法創(chuàng)建的速度比較慢撤奸,而且時公認(rèn)要逐步廢棄的方法吠昭;除非你是老版本,否則請務(wù)必精良使用新的方法創(chuàng)建寂呛。

5.自定義對象的屬性

5.1添加屬性

PS C:\WINDOWS\System32> $myObject

Name  Language   State
----  --------   -----
Kevin PowerShell Texas


PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $myObject | Add-Member -MemberType NoteProperty -Name 'ID' -Value 'KevinMarquette'
PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $myObject

Name  Language   State ID
----  --------   ----- --
Kevin PowerShell Texas KevinMarquette


PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $myObject.ID
KevinMarquette
PS C:\WINDOWS\System32>

5.2移除屬性

PS C:\WINDOWS\System32> $myObject.psobject.properties.remove('ID')
PS C:\WINDOWS\System32> $myObject

Name  Language   State
----  --------   -----
Kevin PowerShell Texas


PS C:\WINDOWS\System32>

.psobject 是內(nèi)部成員怎诫,它使你能夠訪問基對象元數(shù)據(jù)瘾晃。

5.3列出屬性名稱

PS C:\WINDOWS\System32> $myObject | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name
Language
Name
State

PS C:\WINDOWS\System32> $myObject | Get-Member


 TypeName:System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=PowerShell
Name        NoteProperty string Name=Kevin
State       NoteProperty string State=Texas


PS C:\WINDOWS\System32>

或者

PS C:\WINDOWS\System32> $myobject.psobject.properties.name
Name
Language
State
PS C:\WINDOWS\System32>

5.4動態(tài)訪問屬性

$myObject.Name
or
$myObject.'Name'

都是允許的方法

PS C:\WINDOWS\System32> $myObject.Name
Kevin
PS C:\WINDOWS\System32> $myObject.'Name'
Kevin
PS C:\WINDOWS\System32>


因此我們可以利用第二種方式并定義變量的形式實現(xiàn)動態(tài)訪問自定義對象的屬性

$property = 'Name'
$myObject.$property

PS C:\WINDOWS\System32> $property = 'Name'
PS C:\WINDOWS\System32> $myObject.$property
Kevin
PS C:\WINDOWS\System32>

6.PSCustomObject轉(zhuǎn)換為HshTable

PS C:\WINDOWS\System32> $hashtable = @{}
PS C:\WINDOWS\System32> foreach( $property in $myobject.psobject.properties.name )
>> {
>>     $hashtable[$property] = $myObject.$property
>> }
PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $hashtable

Name                           Value
----                           -----
Name                           Kevin
Language                       PowerShell
State                          Texas


PS C:\WINDOWS\System32>

7.自定義對象的方法(Method)

如果需要將腳本方法添加到對象贷痪,則可以使用 Add-MemberScriptBlock 執(zhí)行此操作。 必須使用 this 自動變量引用當(dāng)前對象蹦误。 下面是將對象轉(zhuǎn)換為哈希表的 scriptblock劫拢。

$ScriptBlock = {
 $hashtable = @{}
 foreach( $property in $this.psobject.properties.name )
 {
 $hashtable[$property] = $this.$property
 }
 return $hashtable
}

然后

PS C:\WINDOWS\System32> $memberParam = @{
>>     MemberType = "ScriptMethod"
>>     InputObject = $myobject
>>     Name = "ToHashtable"
>>     Value = $scriptBlock
>> }
PS C:\WINDOWS\System32> Add-Member @memberParam
PS C:\WINDOWS\System32>
PS C:\WINDOWS\System32> $myObject

Name  Language   State
----  --------   -----
Kevin PowerShell Texas


PS C:\WINDOWS\System32> $myObject | Get-Member


 TypeName:System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Language    NoteProperty string Language=PowerShell
Name        NoteProperty string Name=Kevin
State       NoteProperty string State=Texas
ToHashtable ScriptMethod System.Object ToHashtable();


PS C:\WINDOWS\System32>

使用自定義的Method

PS C:\WINDOWS\System32> $myObject.ToHashtable()

Name                           Value
----                           -----
Name                           Kevin
Language                       PowerShell
State                          Texas


PS C:\WINDOWS\System32>

8.自定義對象類型的 PSTypeName

既然我們有了一個對象,我們還可以用它做一些可能不那么顯而易見的事情强胰。 第一件事就是為它指定 PSTypeName舱沧。 以下是我看到的最常用的方法:

$myObject.PSObject.TypeNames.Insert(0,"My.Object")


PS C:\Users\Administrator> $myObject.PSObject.TypeNames
My.Object
System.Management.Automation.PSCustomObject
System.Object
PS C:\Users\Administrator>

或者

$myObject1 = [PSCustomObject]@{
 PSTypeName = 'My.Object'
 Name       = 'Kevin'
 Language   = 'PowerShell'
 State      = 'Texas'
}

PS C:\Users\Administrator> $myObject.PSObject.TypeNames
My.Object
System.Management.Automation.PSCustomObject
System.Object
PS C:\Users\Administrator>
##我本人更新?lián)Q這種方式

9.自定義對象結(jié)合array使用的例子(一般寫腳本收集數(shù)據(jù)時比較常用)

$myObject1 = [PSCustomObject]@{
 Name     = 'Arthur'
 Language = 'PowerShell'
 State    = 'Texas'
}


$myObject2 = [PSCustomObject]@{
 Name     = 'Bill'
 Language = 'Python'
 State    = 'Texas'
}
$a = @()

$a += $myObject1
$a += $myObject2

PS C:\Users\Administrator> $a

Name     Language   State
----     --------   -----
Arthur   PowerShell Texas
Bill     Python     Texas


PS C:\Users\Administrator>
PS C:\Users\Administrator> $a | select Name

Name
----
Arthur
Bill

PS C:\Users\Administrator>

Powershell自定義變量進(jìn)階篇

1.Update-TypeData

PowerShell 為我們決定默認(rèn)情況下顯示哪些屬性。 很多本機命令都有一個可以完成所有繁重工作的 .ps1xml格式化文件

1.1帶有 DefaultPropertySet 的 Update-TypeData

$TypeData = @{
 TypeName = 'My.Object'
 DefaultDisplayPropertySet = 'Name','Language'
}
Update-TypeData @TypeData

$myObject = [PSCustomObject]@{
 PSTypeName = 'My.Object'
 Name       = 'Kevin'
 Language   = 'PowerShell'
 State      = 'Texas'
}

PS C:\Users\Administrator> $myObject | Format-List
Name     : Kevin
Language : PowerShell

PS C:\Users\Administrator> $myObject | Format-List *
Name     : Kevin
Language : PowerShell
State    : Texas

PS C:\Users\Administrator>

現(xiàn)在偶洋,我可以輕松地創(chuàng)建具有很多屬性的對象熟吏,并在從 shell 中查看時,為其提供一個經(jīng)過定制的干凈清爽的視圖玄窝。

1.2帶有 ScriptProperty 的 Update-TypeData

如何為你的對象創(chuàng)建腳本屬性呢牵寺?

$myObject = [PSCustomObject]@{
 PSTypeName = 'My.Object'
 Name       = 'Kevin'
 Language   = 'PowerShell'
 State      = 'Texas'
}

$TypeData = @{
 TypeName = 'My.Object'
 MemberType = 'ScriptProperty'
 MemberName = 'UpperCaseName'
 Value = {$this.Name.toUpper()}
}
Update-TypeData @TypeData


PS C:\Users\Administrator> $myObject | Format-List *


Name          : Kevin
Language      : PowerShell
State         : Texas
UpperCaseName : KEVIN



PS C:\Users\Administrator>

你可以在創(chuàng)建對象之前或之后執(zhí)行此操作,它仍可正常工作恩脂。 這就是將 Add-Member 與腳本屬性一起使用帶來的不同之處帽氓。 當(dāng)你通過我前面提及的方式使用 Add-Member 時,它只存在于對象的特定實例上俩块。 此方法適用于具有此 TypeName 的所有對象黎休。

本文如有考慮步驟出現(xiàn)任何紕漏,歡迎大家不吝指正玉凯。
——夏明亮

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末势腮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漫仆,更是在濱河造成了極大的恐慌嫉鲸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歹啼,死亡現(xiàn)場離奇詭異玄渗,居然都是意外死亡座菠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門藤树,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浴滴,“玉大人,你說我怎么就攤上這事岁钓∩裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵屡限,是天一觀的道長品嚣。 經(jīng)常有香客問我,道長钧大,這世上最難降的妖魔是什么翰撑? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮啊央,結(jié)果婚禮上眶诈,老公的妹妹穿的比我還像新娘。我一直安慰自己瓜饥,他們只是感情好逝撬,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乓土,像睡著了一般宪潮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趣苏,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天狡相,我揣著相機與錄音,去河邊找鬼拦键。 笑死谣光,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芬为。 我是一名探鬼主播萄金,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媚朦!你這毒婦竟也來了氧敢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤询张,失蹤者是張志新(化名)和其女友劉穎孙乖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡唯袄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年弯屈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋拷。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡资厉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔬顾,到底是詐尸還是另有隱情宴偿,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布诀豁,位于F島的核電站窄刘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舷胜。R本人自食惡果不足惜娩践,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逞带。 院中可真熱鬧欺矫,春花似錦纱新、人聲如沸展氓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遇汞。三九已至,卻和暖如春簿废,著一層夾襖步出監(jiān)牢的瞬間空入,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工族檬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歪赢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓单料,卻偏偏與公主長得像埋凯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扫尖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容