PowerShellPowerShell入門


備註

Windows PowerShell是Windows Management Framework的shell和腳本組件,Windows Management Framework是Microsoft構建於.NET Framework上的自動化/配置管理框架。自Windows 7 / Windows Server 2008 R2起,默認情況下會在所有受支持的Windows客戶端和服務器操作系統版本上安裝PowerShell。可以通過下載更高版本的Windows Management Framework (WMF)隨時更新Powershell。 PowerShell 6的“Alpha”版本是跨平台的(Windows,Linux和OS X),需要從此版本頁面下載和安裝。

其他資源:

版本

包含在Windows中筆記發布日期
1.0 XP / Server 2008 2006-11-01
2.0 7 / Server 2008 R2 2009-11-01
3.0 8 / Server 2012 2012-08-01
4 8.1 / Server 2012 R2 2013年11月1日
5 10 / Server 2016技術預覽版二零一五年十二月十六日
5.1 10週年紀念版/ Server 2016 2017年1月27日

別名和類似功能

在PowerShell中,有許多方法可以實現相同的結果。這可以通過簡單熟悉的Hello World 示例很好地說明:

使用Write-Host

Write-Host "Hello World"  
 

使用Write-Output

Write-Output 'Hello world'
 

值得注意的是,雖然Write-OutputWrite-Host 都寫入屏幕,但存在細微差別。 Write-Host 寫入stdout(即控制台屏幕),而Write-Output 寫入stdout AND到輸出[success]流,允許重定向 。重定向(和一般的流)允許將一個命令的輸出作為輸入引導到另一個命令,包括賦值給變量。

> $message = Write-Output "Hello World"
> $message
"Hello World"
 

這些類似的功能不是別名,但如果想要避免“污染”成功流,則可以產生相同的結果。

Write-Output 別名為EchoWrite

Echo 'Hello world'
Write 'Hello world'
 

或者,只需輸入“Hello world”!

'Hello world'
 

所有這些都將導致預期的控制台輸出

Hello world
 

PowerShell中別名的另一個示例是舊命令提示符命令和BASH命令與PowerShell cmdlet的公共映射。以下所有內容都會生成當前目錄的目錄列表。

C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
 

最後,您可以使用Set-Alias cmdlet創建自己的別名!作為一個例子,讓我們的命名為Test-NetConnection ,它本質上是與命令提示符的ping命令等效的PowerShell,以“ping”。

Set-Alias -Name ping -Value Test-NetConnection
 

現在您可以使用ping 而不是Test-NetConnection !請注意,如果別名已被使用,您將覆蓋該關聯。

Alias將活著,直到會話活躍。關閉會話並嘗試運行您在上一個會話中創建的別名後,它將無效。要解決此問題,您可以在開始工作之前將excel中的所有別名導入到會話中一次。

允許存儲在計算機上的腳本以未簽名方式運行

出於安全原因,默認情況下會將PowerShell設置為僅允許簽名腳本執行。執行以下命令將允許您運行未簽名的腳本(必須以管理員身份運行PowerShell才能執行此操作)。

Set-ExecutionPolicy RemoteSigned
 

運行PowerShell腳本的另一種方法是使用Bypass 作為ExecutionPolicy

powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
 

或者從現有的PowerShell控制台或ISE會話中運行:

 Set-ExecutionPolicy Bypass Process
 

執行策略的臨時解決方法也可以通過運行Powershell可執行文件並將任何有效策略作為-ExecutionPolicy 參數傳遞來實現。該策略僅在進程的生命週期內有效,因此不需要對註冊表的管理訪問權限。

C:\>powershell -ExecutionPolicy RemoteSigned
 

有多個其他可用策略,在線站點通常鼓勵您使用Set-ExecutionPolicy Unrestricted 。此策略在更改之前保持不變,並降低系統安全性。這是不可取的。建議使用RemoteSigned ,因為它允許本地存儲和編寫代碼,並且需要使用來自受信任根的證書對遠程獲取的代碼進行簽名。

此外,請注意執行策略可能由組策略強制執行,因此即使策略在系統範圍內更改為Unrestricted ,組策略也可能在下一個執行間隔(通常為15分鐘)恢復該設置。您可以使用Get-ExecutionPolicy -List 查看各種範圍內的執行策略集

TechNet文檔:
SET-ExecutionPolicy
參閱about_Execution_Policies

調用.Net庫方法

可以通過在第三個括號中封裝完整的類名,然後使用:: 調用方法,從PowerShell調用靜態.Net庫方法

#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
 

可以從類本身調用靜態方法,但調用非靜態方法需要.Net類(對象)的實例。

例如,無法從System.DateTime類本身調用AddHours方法。它需要一個類的實例:

C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 

在這種情況下,我們首先創建一個對象 ,例如:

C:\> $Object = [System.DateTime]::Now
 

然後,我們可以使用該對象的方法,甚至是無法直接從System.DateTime類調用的方法,如AddHours方法:

C:\> $Object.AddHours(15)

Monday 12 September 2016 01:51:19
 

評論

通過使用# (哈希)符號預先添加行來評論電源腳本

# This is a comment in powershell
Get-ChildItem
 

您還可以分別在註釋的開頭和結尾使用<##> 進行多行註釋。

<#
This is a 
multi-line
comment
#>
Get-ChildItem
 

創建對象

New-Object cmdlet用於創建對象。

# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime

# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
 

在許多情況下,將創建一個新對像以導出數據或將其傳遞給另一個命令行開關。這可以這樣做:

$newObject = New-Object -TypeName PSObject -Property @{
    ComputerName = "SERVER1"
    Role = "Interface"
    Environment = "Production"
}
 

創建對象的方法有很多種。以下方法可能是創建PSCustomObject 的最短且最快的方法:

$newObject = [PSCustomObject]@{
    ComputerName = 'SERVER1'
    Role         = 'Interface'
    Environment  = 'Production'
}
 

如果您已有一個對象,但只需要一個或兩個額外屬性,則可以使用Select-Object 簡單地添加該屬性:

Get-ChildItem | Select-Object FullName, Name, 
    @{Name='DateTime'; Expression={Get-Date}}, 
    @{Name='PropertieName'; Expression={'CustomValue'}}
 

所有對像都可以存儲在變量中或傳遞到管道中。您還可以將這些對象添加到集合中,然後在結尾顯示結果。

對象集合與Export-CSV(和Import-CSV)配合良好。 CSV的每一行都是一個對象,每一列都是一個屬性。

格式命令將對象轉換為文本流以供顯示。避免使用Format- *命令直到任何數據處理的最後一步,以保持對象的可用性。

安裝或設置

視窗

PowerShell包含在Windows Management Framework中。現代版本的Windows不需要安裝和設置。

可以通過安裝較新版本的Windows Management Framework來完成對PowerShell的更新。

其他平台

PowerShell 6的“Beta”版本可以安裝在其他平台上。安裝包可在此處獲得

例如,用於Ubuntu 16.04的PowerShell 6發佈到打包存儲庫以便於安裝(和更新)。

要安裝,請運行以下命令:

# Import the public repository GPG keys
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

# Register the Microsoft Ubuntu repository
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list

# Update apt-get
sudo apt-get update

# Install PowerShell
sudo apt-get install -y powershell

# Start PowerShell
powershell

在以超級用戶身份註冊Microsoft存儲庫之後,從那時起,您只需要使用sudo apt-get upgrade powershell 來更新它。然後運行powershell

管道 - 使用PowerShell cmdlet的輸出

人們在開始使用PowerShell進行腳本編寫時遇到的第一個問題是如何操作cmdlet的輸出來執行另一個操作。

管道符號| 在cmdlet的末尾使用它來獲取它導出的數據並將其提供給下一個cmdlet。一個簡單的例子是使用Select-Object僅顯示Get-ChildItem顯示的文件的Name屬性:

Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
 

更高級的管道使用允許我們將cmdlet的輸出傳遞到foreach循環:

Get-ChildItem | ForEach-Object {
    Copy-Item -Path $_.FullName -destination C:\NewDirectory\ 
}

#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
 

請注意,上面的示例使用$ _自動變量。 $ _是$ PSItem的短別名,它是一個自動變量,包含管道中的當前項。