Windows Power Shell(PowerShell)

Windows Power Shell

PowerShell一般指本詞條

Windows PowerShell 是微軟發布的一種命令行外殼程式和腳本環境,使命令行用戶和腳本編寫者可以利用 .NET Framework的強大功能。

引入了許多非常有用的新概念,從而進一步擴展了在 Windows 命令提示符和 Windows Script Host 環境中獲得的知識和創建的腳本。

Windows PowerShell v3將伴隨著Microsoft Hyper-V 3.0和Windows Server 2012發布。PowerShell v3是一個Windows任務自動化的框架,它由一個命令行shell和內置在這個.NET框架上的程式語言組成。

PowerShell v3採用新的cmdlet讓管理員能夠更深入到系統進程中,這些進程可以製作成可執行的檔案或腳本(script)。一條cmdlet是一條輕量命令,Windows PowerShell運行時間在自動化腳本的環境裡調用它。

Cmdlet包括顯示當前目錄的Get-Location,訪問檔案內容的Get-Content和結束運行進程的Stop-Process。

PowerShell v3在Windows Server 8中裝載了Windows Management Framework 3.0。PowerShell運行環境也能嵌入到其它套用。

基本介紹

  • 軟體名稱:WindowsPowerShell
  • 軟體平台:Windows
  • 最近更新時間:2020年02月24日
  • 軟體語言:英文(cmd)
  • 開發商:微軟(Microsoft)
  • 軟體版本:7.0.0-rc.3
  • 軟體大小:9.70 MB
  • 外文名:PowerShell
  • 平台:Windows/.NET
  • 類型:命令行工具
  • 途徑.NET Framework
  • 運行環境:Windows 命令提示符和Windows Script Host
  • 官方文檔:https://docs.microsoft.com/zh-cn/powershell/
  • 開源地址:https://github.com/PowerShell/PowerShell
程式安裝,Powershell,Windows Powershell,新功能,Preview Release,Stable Release,目標客群,執行,執行Windows PowerShell,執行Powershell,PowerShell對應的Windows,產品特性,一致性,互動式腳本環境,面向對象,易於過渡到腳本,新腳本語言,1、PS1檔案,2、執行許可權,3、運行腳本,4、管道,5、變數,6、@符號,7、Split,8、Join,9、斷點,10、Step,優缺點,優點,更好的遠程處理,工作流,可更新的幫助,預定任務,更好的發現,額外功能:CIM,缺點,創建事件日誌,PowerShell 5.0,遠程檔案編輯功能,期望狀態配置,Push模式和Pull模式的配置,在遠程伺服器上運行,Invoke-Command,New-PSSession,註銷RDP,管理多個伺服器,控制IT許可權,期望狀態配置-DSC,控制NTFS許可權,PowerShell的作用,PowerShell節流閥限制,PowerShell細微變化,免費的PowerShell資源與工具,PowerGUI,管理腳本編輯器,PowerCLI社區,Project Onyx,Google,自動化伺服器,建立,設定,

程式安裝

Powershell

有多種方法可以在 Windows 中安裝 PowerShell。 每種安裝方法旨在支持不同的方案和工作流。 選擇最符合需求的方法。
  • Winget - 在 Windows 客戶端上安裝 PowerShell 的建議方法
  • MSI 包 - Windows Server 和企業部署方案的最佳選擇
  • ZIP 包 -“旁載入”或安裝多個版本的最簡單方法
  • 將此方法用於 Windows Nano Server、Windows IoT 和基於 Arm 的系統
.NET 全局工具 - 非常適用於安裝和使用其他全局工具的 .NET 開發人員
Microsoft Store 包 - 適用於 PowerShell 臨時用戶進行安裝的一種簡單方法,但有一些限制
備註
本文中的安裝命令適用於最新穩定版的 PowerShell。 若要安裝不同版本的 PowerShell,請調整命令以匹配所需的版本。 以下連結會將定向到 GitHub 上 PowerShell 存儲庫中每個版本的發布頁面。
  • 穩定版:https://aka.ms/powershell-release?tag=stable
  • LTS 版本:https://aka.ms/powershell-release?tag=lts
  • 預覽版:https://aka.ms/powershell-release?tag=preview
可在“版本”頁的“資產”部分中找到每個包的下載連結。 由於“資產” 部分可能處於摺疊狀態,因此可能需要單擊展開它。
使用 Winget 安裝 PowerShell(推薦)
Windows 包管理器 Winget 是一種命令行工具,用戶可以使用它在 Windows 客戶端計算機上查找、安裝、升級、刪除和配置應用程式。 此工具是 Windows 程式包管理器服務的客戶端接口。 默認情況下,winget命令行工具作為套用安裝程式Windows 11 和現代版本的 Windows 10 捆綁在一起。
備註
若要查看系統要求列表和安裝說明,請參閱 winget 文檔。
Winget 當前未在 Windows 伺服器上運行。
通過以下命令,可使用已發布的 winget 包安裝 PowerShell:
winget search Microsoft.PowerShell
Name Id Version Source --------------------------------------------------------------- PowerShell Microsoft.PowerShell 7.2.6.0 winget PowerShell Preview Microsoft.PowerShell.Preview 7.3.0.6 winget
使用 id 參數安裝 PowerShell 或 PowerShell 預覽版
winget install --id Microsoft.Powershell --source winget winget install --id Microsoft.Powershell.Preview --source winget
安裝 MSI
若要在 Windows 上安裝 PowerShell,請使用以下連結從 GitHub 下載安裝包
  • PowerShell-7.2.6-win-x64.msi
  • PowerShell-7.2.6-win-x86.msi
下載後,雙擊安裝程式檔案並按照提示進行操作。
安裝程式在 Windows“開始”選單中創建一個捷徑
  • 默認情況下,包安裝位置為 $env:ProgramFiles\PowerShell\<version>
  • 可以通過“開始”選單或 $env:ProgramFiles\PowerShell\<version>\pwsh.exe 啟動 PowerShell
備註
PowerShell 7.2 安裝到新目錄,並與 Windows PowerShell 5.1 並行運行。 PowerShell 7.2 是就地升級,升級後會替換 PowerShell 7.0 及更低版本。
  • PowerShell 7.2 安裝到 $env:ProgramFiles\PowerShell\7
  • $env:ProgramFiles\PowerShell\7 資料夾已添加到 $env:PATH
  • 以前發布的版本所在的資料夾將被刪除
如果需要與其他版本並行運行 PowerShell 7.2,請使用 ZIP 安裝方法將其他版本安裝到其他資料夾。
PowerShell 7.2 中支持 Microsoft 更新
PowerShell 7.2 支持 Microsoft 更新。 啟用此功能時,之後在傳統 Microsoft 更新 (MU) 管理流中獲得最新的 PowerShell 7 更新,無論是包含適用於企業的 Windows 更新、WSUS、Microsoft Endpoint Configuration Manager,還是包含設定中的互動式 MU 對話框。
PowerShell 7.2 MSI 包包含以下命令行選項:
  • USE_MU - 該屬性有兩個可能值:
  • 1(默認)- 選擇通過 Microsoft 更新、WSUS 或 Configuration Manager 進行更新
  • 0 - 不選擇通過 Microsoft 更新、WSUS 或 Configuration Manager 進行更新
ENABLE_MU
  • 1(默認)- 選擇加入使用 Microsoft 更新進行自動更新
  • 0 - 不選擇加入使用 Microsoft 更新。
備註
可能已在之前的安裝或手動配置中設定了啟用更新。 使用
ENABLE_MU=0
並不會刪除現有設定。 此外,此設定可由管理員控制的“組策略”設定管理。
有關詳細信息,請參閱 PowerShell Microsoft 更新常見問題解答
從命令行安裝 MSI 包
可以通過命令行安裝 MSI 包,這樣管理員能夠在沒有用戶互動的情況下部署包。 MSI 包中有下列控制安裝選項的屬性:
  • ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL - 此屬性控制用於將 Open PowerShell 項添加到 Windows 資源管理器中的上下文選單的選項。
  • ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL - 此屬性控制用於將 Run with PowerShell 項添加到 Windows 資源管理器中的上下文選單的選項。
  • ENABLE_PSREMOTING - 此屬性控制用於在安裝過程中啟用 PowerShell 遠程處理的選項。
  • REGISTER_MANIFEST - 此屬性控制用於註冊 Windows 事件日誌記錄清單的選項。
  • ADD_PATH - 此屬性控制用於將 PowerShell 添加到 Windows PATH 環境變數的選項。
下面的示例展示了如何在啟用所有安裝選項的情況下無提示安裝 PowerShell。
msiexec.exe /package PowerShell-7.2.6-win-x64.msi /quiet ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL=1 ENABLE_PSREMOTING=1 REGISTER_MANIFEST=1 USE_MU=1 ENABLE_MU=1 ADD_PATH=1
有關 Msiexec.exe 命令行選項的完整列表,請參閱命令行選項。
安裝 ZIP 包
提供有 PowerShell 二進制 ZIP 存檔,從而支持高級部署方案。 從當前版本頁下載以下 ZIP 存檔之一。
  • PowerShell-7.2.6-win-x64.zip
  • PowerShell-7.2.6-win-x86.zip
  • PowerShell-7.2.6-win-arm64.zip
根據該檔案的下載方式,你可能需要使用 Unblock-File cmdlet 解鎖。 將內容解壓到你選擇的位置,然後從該位置運行 pwsh.exe。 與安裝 MSI 包不一樣,安裝 ZIP 存檔不會檢查先決條件。 為了讓使用 WSMan 的遠程處理能夠正常運行,請確保已滿足先決條件
使用此方法在類似於 Microsoft Surface Pro X 的計算機上安裝基於 ARM 的 PowerShell 版本。為獲得最佳結果,請將 PowerShell 安裝到 $env:ProgramFiles\PowerShell\7
資料夾。
作為 .NET 全局工具安裝
如果你已安裝 .NET Core SDK,則可以安裝 PowerShell 作為 .NET 全局工具。
dotnet tool install --global PowerShell
dotnet 工具安裝程式將 $env:USERPROFILE\.dotnet\tools 添加到 $env:PATH 環境變數中。 不過,當前運行的 shell 沒有更新後的 $env:PATH。 若要從新 shell 啟動 PowerShell,可以鍵入“pwsh”。
PowerShell 7.3 是基於 .NET 7.0 構建的下一個穩定版本。
PowerShell 7.3 包括以下功能、更新和中斷性變更。
Windows 10 IoT 企業版部署
Windows 10 IoT 企業版隨附 Windows PowerShell,可用來部署 PowerShell 7。
PowerShell複製
# Replace the placeholder information for the following variables: $deviceip = '<device ip address' $zipfile = 'PowerShell-7.2.6-win-Arm64.zip' $downloadfolder = 'u:\users\administrator\Downloads' # The download location is local to the device. # There should be enough space for the zip file and the unzipped contents. # Create PowerShell session to target device Set-Item -Path WSMan:\localhost\Client\TrustedHosts $deviceip $S = New-PSSession -ComputerName $deviceIp -Credential Administrator # Copy the ZIP package to the device Copy-Item $zipfile -Destination $downloadfolder -ToSession $S #Connect to the device and expand the archive Enter-PSSession $S Set-Location u:\users\administrator\Downloads Expand-Archive .\PowerShell-7.2.6-win-Arm64.zip # Set up remoting to PowerShell 7 Set-Location .\PowerShell-7.2.6-win-Arm64 # Be sure to use the -PowerShellHome parameter otherwise it tries to create a new # endpoint with Windows PowerShell 5.1 .\Install-PowerShellRemoting.ps1 -PowerShellHome .
設定 PowerShell 遠程處理時,你收到一條錯誤訊息,並與設備下線。 PowerShell 必須重啟 WinRM。 至此可以連線到設備上的 PowerShell 7 終結點
# Be sure to use the -Configuration parameter. If you omit it, you connect to Windows PowerShell 5.1 Enter-PSSession -ComputerName $deviceIp -Credential Administrator -Configuration PowerShell.7.2.6
Windows 10 IoT 核心版部署
當你添加 IOT_POWERSHELL 功能後,Windows 10 IoT 核心版便會添加 Windows PowerShell,我們可以使用它來部署 PowerShell 7。 對於 IoT 核心版,還可以遵循為 Windows 10 IoT 企業版定義的步驟。
若要在隨附映像中添加最新的 PowerShell,請使用 Import-PSCoreRelease 命令在工作區域中添加包,然後將 OPENSRC_POWERSHELL 功能添加到映像中。
備註
對於 ARM64 體系結構,在你添加 IOT_POWERSHELL 功能後,它不會添加 Windows PowerShell。 因此,基於 zip 的安裝將不起作用。 需要使用
Import-PSCoreRelease
命令將其添加到映像中。
在 Nano Server 上進行部署
為了更好地理解這些說明,假定 Nano Server 是已運行 PowerShell 版本的“無外設”作業系統。 有關詳細信息,請參閱 Nano Server 映像生成器文檔。
可以使用兩種不同的方法來部署 PowerShell 二進制檔案
  1. 脫機 - 安裝 Nano Server VHD,並將 zip 檔案的內容解壓到安裝映像中的所選位置。
  2. 在線上 - 通過 PowerShell 會話傳輸 zip 檔案,並在所需位置中將其解壓。
在這兩種情況下,都需要 Windows x64 ZIP 版本包。 在 PowerShell 的“管理員”實例中運行命令
PowerShell 脫機部署
  1. 使用常用 zip 實用工具將包解壓到已安裝的 Nano Server 映像中的目錄。
  2. 卸載映像並啟動。
  3. 連線到 Windows PowerShell 的內置實例。
  4. 按照說明使用“另一種實例技術”創建遠程處理終結點。
PowerShell 在線上部署
若要將 PowerShell 部署到 Nano Server,請按照以下步驟操作。
# Replace the placeholder information for the following variables: $ipaddr = '<Nano Server IP address>' $credential = Get-Credential # <An Administrator account on the system> $zipfile = 'PowerShell-7.2.6-win-x64.zip' # Connect to the built-in instance of Windows PowerShell $session = New-PSSession -ComputerName $ipaddr -Credential $credential # Copy the file to the Nano Server instance Copy-Item $zipfile c:\ -ToSession $session # Enter the interactive remote session Enter-PSSession $session # Extract the ZIP file Expand-Archive -Path C:\PowerShell-7.2.6-win-x64.zip -DestinationPath 'C:\Program Files\PowerShell 7'
如果需要基於 WSMan 的遠程處理,請按照說明使用“另一種實例技術”創建遠程處理終結點。
PowerShell 遠程處理
PowerShell 同時支持採用 WSMan 和 SSH 的 PowerShell 遠程處理協定 (PSRP)。 有關詳細信息,請參閱:
  • 在 PowerShell 中進行 SSH 遠程處理
  • 在 PowerShell 中進行 WSMan 遠程處理
必須滿足以下先決條件才能在較低版本的 Windows 上通過 WSMan 啟用 PowerShell 遠程處理。
  • 安裝 Windows Management Framework (WMF) 5.1(根據需要)。 有關 WMF 的詳細信息,請參閱 WMF 概述。
  • 在低於 Windows 10 的 Windows 版本上安裝通用 C 運行時。 可以通過直接下載或 Windows 更新來獲取它。 完全修補的系統已安裝此包。
支持的 Windows 版本
下表列出了 PowerShell 版本以及支持它們的 Windows 版本。 這些版本在 PowerShell 版本到達支持終止日期或 Windows 版本到達支持終止日期之前受支持。
  • ✅ 指示仍支持 OS 或 PowerShell 版本
  • ❌ 指示不支持 OS 或 PowerShell 版本
  • 🟡 指示該 OS 版本不再支持 PowerShell 版本
  • 當 OS 版本和 PowerShell 版本都具有 ✅ 時,將支持該組合
Windows
7.0 (LTS)
7.1
7.2 (LTS-current)
7.3(預覽版)
✅ Windows Server 2016、2019 或 2022
🟡
✅Windows Server 2012 R2
🟡
✅ Windows Server Core(2012 R2 或更高版本)
🟡
✅ Windows Server Nano(1809 或更高版本)
🟡
❌Windows Server 2012
🟡
🟡
❌ Windows Server 2008 R2
🟡
🟡
✅ Windows 11
🟡
✅ Windows 10 1607+
🟡
✅ Windows 8.1
🟡
備註
對特定版本的 Windows 的支持由 Microsoft 支持部門生命周期策略決定。 有關詳細信息,請參閱:
  • Windows 客戶端生命周期常見問題解答
  • 新式生命周期策略常見問題解答
以下處理器體系結構在 Windows 上支持 PowerShell。
Windows
7.0 (LTS)
7.2 (LTS-current)
7.3(預覽版)
Nano Server 版本 1803 及更高版本
x64、Arm32
X64
X64
Windows Server 2012 R2 及更高版本
x64、x86
x64、x86
x64、x86
Windows Server Core 2012 R2 及更高版本
x64、x86
x64、x86
x64、x86
Windows 10 or 11 客戶端
x64、x86
x64、x86、Arm64
x64、x86、Arm64
Windows 8.1 客戶端
x64、x86
x64、x86
x64、x86
可通過運行 winver.exe 來檢查所使用的版本。
安裝支持
Microsoft 支持本文檔中的安裝方法。 其他源可能會提供其他第三方安裝方法。 儘管這些工具和方法可能有效,但 Microsoft 無法支持這些方法。

Windows Powershell

Powershell 5.1
重要!Skype for Business 2021 年 7 月 31 日停用了 Online。 如果尚未升級在線上Skype for Business,將自動安排這些用戶進行輔助升級。 如果希望自行將組織升級到 Teams,強烈建議立即開始規劃升級路徑。 請記住,成功升級需要在技術準備和用戶準備方面保持一致,因此在開始向 Teams 遷移時請確保使用我們的 升級指南。
如果使用的是 Windows 10 周年更新或 Windows Server 2016,則應已擁有 Windows PowerShell 5.1。 這是因為此應用程式隨這些作業系統預安裝。
要確定你使用的是什麼版本的 Microsoft PowerShell,請在 Windows 7 或 Windows Server 2008 R2 或 Windows Server 2012 計算機上執行以下步驟:
  1. 依次單擊“開始”、“所有程式”、“附屬檔案”和“Windows PowerShell”,然後單擊“Windows PowerShell”。
  2. 在 PowerShell 控制台中,鍵入以下命令,然後按 ENTER:PowerShell複製Get-Host | Select-Object Version
  3. 控制台視窗中隨後應顯示以下類似信息: Version ------- 4.0 如果返回的版本號為 5.1,表明正在運行 Windows PowerShell 5.1。 如果返回的版本號不是 5.1,則需要安裝 Windows PowerShell 5.1。 可從 Microsoft 下載中心下載 Windows Management Framework 5.1(其中包括 Windows PowerShell 5.1)。
驗證已安裝 Windows PowerShell 5.1 後,必須確保 PowerShell 已配置為可以運行遠程腳本。 為此,以管理員身份啟動 PowerShell。 在 Windows 7、Windows Server 2008 R2、Windows Server 2012 或 Windows Server 2012 R2 上執行以下操作:
  1. 單擊“啟動”,依次單擊“所有程式”、“附屬檔案”、“Windows PowerShell”,然後右鍵單擊“Windows PowerShell”,單擊“以管理員身份運行”。
  2. 如果顯示“用戶帳戶控制”對話框,單擊“”確定要通過管理員憑據運行 PowerShell。
如果運行的是 Windows 8,請完成此過程:
  1. 訪問超級按鈕欄,單擊“搜尋”,然後右鍵單擊“Windows PowerShell”。可以通過按住 Windows 徽標鍵並按 C 來在任何 Windows 8 計算機(觸控螢幕或非觸控螢幕)上快速訪問超級按鈕欄。
  2. 在螢幕底部的工具列中,單擊“以管理員身份運行”。
  3. 如果顯示“用戶帳戶控制”對話框,單擊“”確定要通過管理員憑據運行 PowerShell。
在 PowerShell 運行後,必須更改執行策略以允許運行遠程腳本。 在 PowerShell 控制台中,鍵入以下命令,然後按 ENTER:
Set-ExecutionPolicy RemoteSigned -Force
備註
運行上述命令後,可能會收到以下錯誤訊息: > Set-ExecutionPolicy:對註冊表項HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Micrsoft.PowerShell”的訪問被拒絕。 如果未在管理員憑據下運行 PowerShell,則通常會出現此錯誤訊息。 關閉 PowerShell 會話,並以管理員身份啟動新會話。
要驗證是否已正確配置執行策略,請在 PowerShell 提示符處鍵入以下內容,然後按 Enter:
Get-ExecutionPolicy
如果獲得以下值,則所有內容已正確配置:
RemoteSigned
如果當前未運行 Windows PowerShell 5.1,則還需要從 Microsoft 下載中心下載並安裝 Windows Management Framework 5.1。 這是一個安裝程式包,包含 Windows PowerShell 5.1 和 Windows 遠程管理 (WinRM) 3.0。 例如,如果運行的是 Windows 7 SP1,並且尚未更新到 Windows PowerShell 5.1,則可能需要此安裝程式包。 如果運行的是 Windows Server 2016 或 Windows 10 周年更新,則無需安裝 Windows PowerShell 5.1。 這些作業系統上預裝了 Windows PowerShell 5.1。
在安裝 Windows Management Framework 5.1 之前:
  • 確保已下載安裝程式包的正確版本。 如果運行的是 64 位版本的 Windows 7 SP1,請下載檔案 Win7AndW2K8R2-KB3191566-x64.ZIP。 如果運行的是 32 位版本的 Windows 7,請下載檔案 Win7-KB3191566-x86.ZIP。
  • 如果計算機正在運行 Windows 7,請確保已安裝 Windows 7 Service Pack 1。
如果不確定正在運行的 Windows 版本,或者不確定是否已安裝 Windows 7 Service Pack 1,請單擊“開始”,右鍵單擊“計算機”,然後單擊“屬性”。“系統”對話框中將報告此信息。
要安裝 Windows Management Framework 5.1,請完成安裝和配置 WMF 5.1 中的程式。
計算機重新啟動後,驗證 Windows PowerShell 是否可以啟動以及應用程式是否可在管理憑據下運行。如果要執行此操作:
  1. 單擊“啟動”,依次單擊“所有程式”、“附屬檔案”、“Windows PowerShell”,然後右鍵單擊“Windows PowerShell”,單擊“以管理員身份運行”。
  2. 如果顯示“用戶帳戶控制”對話框,單擊“”確定要通過管理員憑據運行 PowerShell。
當 PowerShell 控制台出現時,應該驗證 WinRM 服務是否正在運行並且已正確配置。 要驗證服務是否正在運行,請在 PowerShell 提示符處鍵入以下命令,然後按 Enter:
Get-Service winrm
螢幕上將顯示有關 WinRM 服務的信息:Status NameDisplayName------ ---------------Running winrm Windows Remote Management (WS-Manag...
如果服務狀態不是“正在運行”,請通過鍵入以下命令並按 Enter 來啟動 WinRM 服務:
Start-Service winrm
服務啟動後,請運行以下命令以確保 WinRM 使用基本身份驗證
winrm set winrm/config/client/auth '@{Basic="True"}'
螢幕上將顯示以下類似信息:Auth Basic = true Digest = true Kerberos = true Negotiate = true Certificate = true CredSSP = false
如果基本身份驗證設定為 true,則可以開始使用 PowerShell 連線 Skype for Business Online。

新功能

(內容來自微軟官網)

Preview Release

Powershell 7.4
PowerShell 7.4-preview.2 包括以下功能、更新和中斷性變更。 PowerShell 7.4 現基於 .NET 8.0.0-preview.2 構建。
有關完整的更改列表,請參閱 GitHub 存儲庫中的更改日誌。
中斷性變更
  • Nano Server Docker 映像不適用於此版本
  • 將 ProgressAction 參數添加到通用參數
  • 更新特定 PowerShell API,以便當參數為空字元串時引發 ArgumentException 而不是 ArgumentNullException (#19215)(感謝 @xtqqczze!)
安裝程式更新
Windows MSI 包現提供一種在安裝期間禁用 PowerShell 遙測的選項。 有關詳細信息,請參閱從命令行安裝 msi 包。
Tab 自動補全改進
非常感謝 @MartinGC94 在改進 Tab 自動補全方面的所有貢獻。
  • 解決在腳本中使用空數組表達式補全第一個命令時出現的問題 ([#18355)
  • 修復位置參數補全功能 (#17796)
  • 對補全位置參數時設定的默認形參設定優先權 (#18755)
  • 改進動態參數的偽綁定 (#18030)
  • 改進哈希表鍵的類型推理 (#17907)
  • 修復空返回語句的類型推理錯誤 (#18351)
  • 改進 Get-Random 的類型推理 (#18972)
  • 修復所有範圍變數的類型推理 (#18758)
  • 改進管道中推斷類型的枚舉 (#17799)
  • 在比較枚舉時為比較值添加補全功能 (#17654)
  • 為枚舉添加屬性分配補全 (#19178)
  • 修復 PSCustomObject 變數屬性的補全 (#18682)
  • 修復屬性參數中的成員補全功能 (#17902)
  • 修復具有基類型的類的類成員補全 (#19179)
  • 為 Using 關鍵字添加補全功能 (#16514)
Cmdlet 和引擎改進
更新 Web cmdlet - 非常感謝 @CarloToso 在改進 Web cmdlet 方面的貢獻。
  • 如果狀態代碼為 429,Web cmdlet 會從回響頭獲取 Retry-After 間隔 (#18717)
  • Web cmdlet 將默認字元集編碼設定為 UTF8 (#18219)
  • 將 WebSession.MaximumRedirection 保持不變 (#19190)
  • WebCmdlet 解析 XML 聲明來獲取編碼值(如果存在)。 (#18748)
  • 修復在沒有編碼的情況下在 webcmdlet 中使用 xml -Body 時出現的問題 (#19281)
  • 調整 PUT 方法行為,使其在 WebCmdlet 中對默認內容類型執行一次 POST (#19152)
  • 在 WebCmdlet 中考慮來自標頭的 ContentType (#19227)
  • 允許通過向 Web cmdlet 添加 -PreserveHttpMethodOnRedirect 來保留原始 HTTP 方法 (#18894)
  • Webcmdlet 在從 https 重定向 http 時顯示錯誤 (#18595)
  • 向 Web cmdlet 添加 AllowInsecureRedirect 開關 (#18546)
  • 改進當內容長度未知時 Web cmdlet 中的詳細訊息 (#19252)
  • 根據 Invoke-WebRequest 中的回響生成連結的相對 URI (#19092)
  • 修復 WebCmdlet 中 -CustomMethod POST 的重定向 (#19111)
  • 釋放 Webcmdlet 中的先前回響 (#19117)
  • 改進 Invoke-WebRequest xml 和 json 錯誤格式 (#18837)
  • 下降 ValidateNotNullOrEmpty 添加到 WebCmdlet 的 OutFile 和 InFile 參數 (#19044)
  • HttpKnownHeaderNames 更新標頭列表 (#18947)
  • Invoke-RestMethod -FollowRelLink 修復包括逗號的連結 (#18829)
  • 修復在 Web cmdlet 中管理重定向和 KeepAuthorization 時的 bug (#18902)
  • 將 StatusCode 添加到 HttpResponseException (#18842)
  • 在 Web Cmdlet 中支持 HTTP 持久連線 (#19249)(感謝 @stevenebutler!)
其他 cmdlet
  • 將 Path 和 LiteralPath 參數添加到 Test-Json cmdlet (#19042)(感謝 @ArmaanMcleod!))
  • 將 NoHeader 參數添加到 ConvertTo-Csv 和 Export-Csv cmdlet (#19108)(感謝 @ArmaanMcleod!))
  • 向 Stop-Transcript 添加了 Confirm 和 WhatIf 參數 (#18731)(感謝 @JohnLBevan!)
  • 向 Get-Command 添加了 FuzzyMinimumDistance 參數 (#18261)
  • 使 Encoding 參數能夠在 PowerShell 中進行 ANSI 編碼 (#19298)(感謝 @CarloToso!))
  • 將 progress 添加到 Copy-Item (#18735)
  • 在非美國系統上使用隱式區域性時,Update-Help 會報告錯誤。 (#17780)(感謝 @dkaszews!)
  • 對 $PSStyle 的更新 添加了 Dim 和 DimOff 屬性 (#18653)
  • 向 PSStyle 類添加了靜態方法,用於將前台和後台 ConsoleColor 值映射到 ANSI 轉義序列 (#17938)
  • 通過實驗性功能添加了新格式設定屬性
其他引擎更新
  • 在聲明 NoRunspaceAffinity 屬性時使 PowerShell 類與 Runspace 不關聯 (#18138)
  • 添加了 ValidateNotNullOrWhiteSpace 特性 (#17191)(感謝 @wmentha!)
  • 向列表中添加了 sqlcmd 以使用舊參數傳遞 (#18559)
  • 添加了 cd~ 函式 (#18308)(感謝 @GigaScratch!)
實驗性功能
PowerShell 7.4 引入了以下實驗性功能:
  • PSCustomTableHeaderLabelDecoration - 為非屬性成員的表標題標籤添加格式區分。
  • 此功能還會向 $PSStyle.Formatting 添加 CustomTableHeaderLabel 屬性,以便更改標題標籤的格式。
PSFeedbackProvider - 將硬編碼的建議框架替換為可擴展的反饋提供程式。
  • 此功能還會向 $PSStyle.Formatting 添加 FeedbackProvider 和 FeedbackText 屬性,以便更改反饋訊息的格式。
PSModuleAutoLoadSkipOfflineFiles - 模組發現跳過了由雲提供商標記為不完全在磁碟上的檔案。
PSCommandWithArgs - 現支持將參數作為單個字元串傳遞給命令
PowerShell 7.4 刪除了以下實驗性功能:
  • 已啟用功能時,將 PSNativeCommandErrorActionPreference - $PSNativeCommandUseErrorActionPreference 設定為 $true (#18695)
  • PSCommandNotFoundSuggestion - 此功能使用可擴展的反饋提供程式,而不是硬編碼的建議 #18726)
有關實驗性功能的詳細信息,請參閱使用實驗性功能。

Stable Release

Powershell 7.3
PowerShell 7.3 是基於 .NET 7.0 構建的下一個穩定版本。
PowerShell 7.3 包括以下功能、更新和中斷性變更。
重大更改和改進
  • 已在此版本中更新或刪除 Windows API 以實現合規性,這表示 PowerShell 7.3 不在 Windows 7 上運行。 雖然不再支持 Windows 7,但以前的版本可以在 Windows 7 上運行。
  • 適用於 Hyper-V 的 PowerShell Direct 僅在 Windows 10 版本 1809 及更高版本上受支持。
  • 由於 .NET 7 中有意的中斷性變更,導致 Test-Connection 中斷。 它由 #17018 跟蹤
  • 將 clean 塊作為 begin、process 和 end 的對等項添加到腳本塊,以便輕鬆清理資源 (#15177)
  • 將 $PSStyle.OutputRendering 的默認值更改為“Host”
  • 使 Out-String 和 Out-File 保持字元串輸入不變 (#17455)
  • 將 System.Security.AccessControl.ObjectSecurity 的類型數據定義移至 Microsoft.PowerShell.Security 模組 (#16355)(感謝 @iSazonov!)
  • 在此更改之前,用戶無需顯式導入 Microsoft.PowerShell.Security 模組,即可使用為 System.Security.AccessControl.ObjectSecurity 實例定義的代碼屬性。
  • 在此更改之後,用戶需要顯式導入 Microsoft.PowerShell.Security 模組,才能使用這些代碼屬性和代碼方法。
Tab 自動補全改進
  • PowerShell 7.3 包括默認啟用預測性 IntelliSense 的 PSReadline 2.2.6。 有關詳細信息,請參閱 about_PSReadLine。
  • 修復了為 ValidateScriptAttribute 指定的腳本塊中的 Tab 自動補全。 (#14550)(感謝 @MartinGC94!)
  • 在 break/continue 後為循環標籤添加了 Tab 自動補全 (#16438)(感謝 @MartinGC94!)
  • 在多個方案中改進哈希表自動補全 (#16498)(感謝 @MartinGC94!)
  • 參數展開
  • Invoke-CimMethod 的 Arguments 參數
  • Get-WinEvent 的 FilterHashtable 參數
  • CIM cmdlet 的 Property 參數
  • 從成員完成方案中刪除重複項
在網路共享(UNC 路徑)自動補全中支持正斜槓 (#17111)(感謝 @sba923!)
改進了成員自動補全 (#16504)(感謝 @MartinGC94!)
為參數優先考慮 ValidateSet 自動補全,而不是枚舉 (#15257)(感謝 @MartinGC94!)
為具有類型參數的泛型方法添加了類型推理支持 (#16951)(感謝 @MartinGC94!)
改進了類型推理和自動補全 (#16963)(感謝 @MartinGC94!)
  • 允許在 ForEach-Object -MemberName 的完成結果中顯示方法
  • 阻止了返回 void 的表達式的完成(如 ([void]("")))
  • 允許非默認類構造函式在類完成基於 AST 時顯示
改進了 $_ 的類型推理 (#17716)(感謝 @MartinGC94!)
修復了 ICollection 的類型推理 (#17752)(感謝 @MartinGC94!)
自動補全變數時防止大括弧被移除 (#17751)(感謝 @MartinGC94!)
為字典的索引表達式添加了自動補全 (#17619)(感謝 @MartinGC94!)
修復了屬性令牌的類型自動補全 (#17484)(感謝 @MartinGC94!)
改進了動態參數 Tab 自動補全 (#17661)(感謝 @MartinGC94!)
避免在值前自動補全參數時綁定位置參數 (#17693)(感謝 @MartinGC94!)
改進了錯誤處理
  • 為具有重定向的命令表達式正確設定了 $? (#16046)
  • 修復了使用 $PSNativeCommandUseErrorActionPreference 時的強制轉換錯誤 (#15993)
  • 使本機命令錯誤處理可以選擇性遵守 ErrorActionPreference (#15897)
  • 將執行檔路徑指定為非零退出代碼 ErrorRecord 的 TargetObject (#16108)(感謝 @rkeithhill!)
會話和遠程處理改進
  • 將 -Options 添加到 PSRP over SSH 命令,以允許直接傳遞 OpenSSH 選項 (#12802)(感謝 @BrannenGH!)
  • 將 -ConfigurationFile 參數添加到 pwsh 以允許使用 .pssc 檔案中定義的會話配置啟動新進程 (#17447)
  • 添加對在非 Windows 平台上使用 New-PSSessionConfigurationFile 的支持 (#17447)
已更新的 cmdlet
  • 將 -HttpVersion 參數添加到 Web cmdlet 中 (#15853)(感謝 @hayhay27!)
  • 為 Web cmdlet 添加對開放式輸入標記的支持 (#16193)(感謝 @farmerau!)
  • 修復了 ConvertTo-Json -Depth 以允許最多 100 個 (#16197)(感謝 @KevRitchie!)@rkeithhill!)
  • 在使用 $using: 表達式調用 Invoke-Command 時改進變數處理 (#16113)(感謝 @dwtaber!)
  • 將 -StrictMode 添加到 Invoke-Command,以允許在本地調用命令時指定嚴格模式 (#16545)(感謝 @Thomas-Yu!)
  • 將 clean 塊作為 begin、process 和 end 的對等項添加到腳本塊,以便輕鬆清理資源 (#15177)
  • 將 -Amended 開關添加到 Get-CimClass cmdlet (#17477)(感謝 @iSazonov)
  • 已將 ConvertFrom-Json -AsHashtable 更改為使用有序哈希表 (#17405)
  • 在傳送到 Out-GridView 之前,刪除了字元串中的 ANSI 轉義序列 (#17664)
  • 向 New-TimeSpan 添加了 Milliseconds 參數 (#17621)(感謝 @NoMoreFood!)
  • 顯示方法定義和重載時顯示可選參數 (#13799)(感謝 @eugenesmlv!)
  • 即使當前工作目錄不復存在,仍允許執行命令 (#17579)
  • 通過 Set-AuthenticodeSignature -TimeStampServer 添加對 HTTPS 的支持 (#16134)(感謝 @Ryan-Hutchison-USAF!)
  • 使用當前區域性在表中呈現十進制數 (#17650)
  • 為 OrderedDictionary 添加有序類型加速器 (#17804)(感謝 @fflaten!)
  • 將 find.exe 添加到 Windows 的舊參數綁定行為 (#17715)
  • 將 -noprofileloadtime 開關添加到 pwsh (#17535)(感謝 @rkeithhill!)
有關完整的更改列表,請參閱 GitHub 存儲庫中的更改日誌。
實驗性功能
在 PowerShell 7.3 中,以下實驗性功能成為主流:
  • PSAnsiRenderingFileInfo - 此功能添加 $PSStyle.FileInfo 成員,並啟用特定檔案類型的著色。
  • PSCleanBlock - 將 clean 塊作為 begin、process 和 end 的對等項添加到腳本塊,以便輕鬆清理資源。
  • PSAMSIMethodInvocationLogging - 擴展傳送到 AMSI 以供檢查的數據,以包括對 .NET 方法成員的所有調用。
  • PSNativeCommandArgumentPassing - PowerShell 使用 StartProcessInfo 對象的 ArgumentList 屬性,而不是在調用本機執行檔時重建字元串的舊機制。PowerShell 7.3.1 將 sqlcmd.exe 添加到 Windows 中使用 Legacy 參數傳遞樣式的本機命令列表。
  • PSExec - 添加新的 Switch-Process cmdlet(別名 exec),為非 Windows 系統提供 exec 兼容性。PowerShell 7.3.1 將 exec 別名更改為包裝 Switch-Process 的函式。 利用該函式,將參數傳遞給可能錯誤地綁定到 WithCommand 參數的本機命令。
PowerShell 7.3 引入了以下實驗性功能:
  • PSNativeCommandErrorActionPreference - 添加 $PSNativeCommandUseErrorActionPreference 變數以使本機命令產生的錯誤成為 PowerShell 錯誤。
PowerShell 7.3 刪除了以下實驗性功能:
  • 不再支持 PSNativePSPathResolution 實驗性功能。
  • 不再支持 PSStrictModeAssignment 實驗性功能。
有關實驗性功能的詳細信息,請參閱使用實驗性功能。

目標客群

Windows PowerShell 入門主要面向之前沒有 Windows PowerShell 背景知識的 IT 專業人員、程式設計師和高級用戶。雖然具備腳本和 WMI 方面的背景知識會有所幫助,但是理解本文檔並不假定或要求您具備此方面知識。
關於 Windows PowerShell
通過解決長期存在的問題並添加一些新的功能,Windows PowerShell 旨在改進命令行和腳本環境。PowerShell以.NET Framework為平台,接收和返回.NET對象,此舉為管理和配置微軟系統帶來了新的方法和工具。

執行

執行Windows PowerShell

1.在Windows 作業系統里,點擊開始->運行->輸入PowerShell,進入windows PowerShell。
2.在任意資料夾按住[shift]鍵單擊滑鼠右鍵,選擇[在此處打開PowerShell視窗(S)]
3.按住[windows]+[R]鍵,輸入powershell
4.在命令指示符(cmd)中輸入powershell,在cmd中實現powershell的功能

執行Powershell

1.在Windows 作業系統里,點擊開始->運行輸入pwsh,進入PowerShell。
2.按住[windows]+[R]鍵,輸入pwsh。
3.在命令提示符(Command Prompt)中輸入powershell,在cmd中實現powershell的功能

PowerShell對應的Windows

在Windows 7中內置了PowerShell2.0, Windows 8中內置了PowerShell3.0,Windows 10,11中內置了PowerShell5.1,如果本機沒有添加,可在網上下載安裝包進行安裝,或者下載WebPI,通過WebPI安裝PowerShell。

產品特性

您可輕易發現 Windows Powershell 的功能。例如,若要查找用於查看和更改Windows 服務的cmdlet 列表,執行:開始->運行->cmd,在命令行下輸入 PowerShell 進入 windows PowerShell,再輸入如下命令:
get-command *-service
在發現可完成任務的 cmdlet 之後,可以使用 Get-Help cmdlet 了解有關該 cmdlet 的詳細信息。例如,若要顯示有關 Get-Service cmdlet 的幫助,請鍵入:
get-help get-service
若要充分理解該 cmdlet 的輸出,則可通過管道將其輸出傳遞給 Get-Member cmdlet。例如,以下命令將通過 Get-Service cmdlet 顯示有關該對象輸出的成員的信息。
get-service | get-member

一致性

管理系統可能是一項複雜的任務,而具有統一接口的工具將有助於控制其固有的複雜性。然而,無論是命令行工具還是可編寫腳本的 COM 對象,在一致性方面都乏善可陳。
Windows PowerShell 的一致性是其主要優點中的一項。例如,如果您學會了如何使用 Sort-Object cmdlet,則可利用這一知識對任何 cmdlet 的輸出進行排序。而無需了解每個 cmdlet 的不同的排序例程
此外,cmdlet 開發人員也不必為其 cmdlet 設計排序功能。Windows PowerShell 為他們提供了框架,而該框架可提供基本的功能,並強制他們在接口的許多方面保持一致。該框架雖然消除了通常會留給開發人員的某些選項,但作為回報,開發強健、易於使用的 cmdlet 的工作將更加簡單。

互動式腳本環境

Windows PowerShell 將互動式環境和腳本環境組合在一起,從而允許您訪問命令行工具和 COM 對象,同時還可利用 .NET Framework 類庫 (FCL) 的強大功能。
此環境對 Windows命令提示符進行了改進,後者提供了帶有多種命令行工具的互動式環境。此外,還對 Windows Script Host (WSH)腳本進行了改進,後者允許您使用多種命令行工具和 COM 自動對象,但未提供互動式環境。
通過將對所有這些功能的訪問組合在一起,Windows PowerShell 擴展了互動用戶和腳本編寫者的能力,從而更易於進行系統管理

面向對象

儘管您可以通過以文本方式鍵入命令與 Windows PowerShell 進行互動,但 Windows PowerShell 是基於對象的,而不是基於文本的。命令的輸出即為對象。可以將輸出對象傳送給另一條命令以作為其輸入。因此,Windows PowerShell 為未曾使用過其他外殼程式的人員提供了熟悉的界面,同時引入了新的、功能強大的命令行範例。通過允許傳送對象(而不是文本),它擴展了在命令之間傳送數據的概念。

易於過渡到腳本

使用 Windows PowerShell,您可以很方便地從以互動方式鍵入命令過渡到創建和運行腳本。您可以在 Windows PowerShell命令提示符下鍵入命令以找到可執行任務的命令。隨後,可將這些命令保存到腳本或歷史記錄中,然後將其複製到檔案中以用作腳本。
識別你即將使用的Provider 通過識別PowerShell里安裝的Provider,你就可以了解默認安裝下PowerShell提供了那些能力。 Provider可以使用一種簡單的訪問方式,暴露位於不同儲存位置的數據。就像是瀏覽不同磁碟上的目錄結構一樣簡單。 Provider把不同的信息存放位置,表示成“驅動器”-目錄這種結構,這樣很容易被用戶所理解。就像我們要訪問一個位於D糟的WIN32目錄下的SETUP.exe檔案,我們要通過瀏覽器,單擊D糟的圖示,然後選擇WIN32目錄並雙擊一樣,如果我們要訪問位於“註冊表”的數據,那么我們也只需要簡單地通過Set-Location命令,來到到“REGISTRY”這個“驅動器”,然後用GET-CHILDITEM命令獲取其子數據就行了。
註:實際上,PowerShell訪問磁碟驅動器,也是通過Provider的,切換驅動器其實和切換其他數據容器是一樣地操作。 例如: Set-Location d:\ 這是切換驅動器 Set-Location HKLM:\ 這是切換到註冊表的HKLM鍵 另外,Get-PSprovider命令,可以查看當前已經安裝的所有PROVIDER。任何熟悉.NET編程的人,都可以編寫Provider。當新的provider被安裝後,就叫做snap-in。snap-in其實是一個動態連線庫dll檔案,可以被安裝到powershell中。然而,當一個snap-in安裝後,卻沒有辦法卸載。 Get-PSProvider: Name Capabilities Drives ---- ------------ ------ Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess {C, D, F, A...} Function ShouldProcess {Function} Registry ShouldProcess {HKLM, HKCU} Variable ShouldProcess {Variable} Certificate ShouldProcess {cert} 這些就是我機器上的默認安裝後的provider。
使用Set-Location和Get-ChildItem瀏覽數據 Set-Location用於改變當前目錄,以及選擇當前的provider,而Get-ChildItem用於獲取當前目錄或者指定目錄下的子對象: 例子: set-location hkcu:\software get-childitem 例子2: GCI -path HKLM:\software
有兩種連線WMI服務的方法:l 使用Get-WmiObject可以很容易地連線到WMI服務,並且獲取WMI對象。 l 使用一個COM對象,“WbemScripting.SWbemLocator”,可以連線WMI的服務。SWbemLocator對象只有一個方法,就是ConnectServer()。該方法接受5個參數:用戶名,密碼,語言代碼,驗證方法(Kerberos, NTLM等),標誌(逾時值)。
下例中,我們使用New-Object命令,創建了一個“WbemScripting.SWbemLocator”的實例。然後用這個實例的ConnectServer方法連線了到了一個WMI的名字空間(root\cimv2),ConnectServer方法返回了一個WMIService對象,接著又用這個對象的subClassesOf()方法,返回了一系列WMI的CLASS: $strComputer = "." $wmiNS = "\root\cimv2" $strUsr ="" #Blank for current security. Domain\Username $strPWD = "" #Blank for current security. $strLocl = "MS_409" #US English. Can leave blank for current language $strAuth = "" #if specify domain in strUsr this must be blank $iFlag = "0" #only two values allowed: 0 and 128. $objLocator = New-Object -comobject "WbemScripting.SWbemLocator" $objWMIService = $objLocator.ConnectServer($strComputer, ` $wmiNS, $strUsr, $strPWD, $strLocl, $strAuth, $iFLag) $colItems = $objWMIService.subClassesOf() Write-Host "There are: " $colItems.count " classes in $wmiNS" foreach ($objItem In $colItems) { $objItem.path_.class }

新腳本語言

由於以下原因,Windows PowerShell 使用它自己的語言,而不是重用現有的語言:
Windows PowerShell 需要用於管理.NET 對象的語言。該語言需要為使用cmdlet 提供一致的環境。該語言需要支持複雜的任務,而不會使簡單的任務變得更複雜。 該語言需要與在.NET編程中使用的高級語言(如C#)一致。

1、PS1檔案

一個PowerShell腳本其實就是一個簡單的文本檔案,這個檔案包含了一系列PowerShell命令,每個命令顯示為獨立的一行,對於被視為PowerShell腳本的文本檔案,它的檔案名稱需要使用.PS1擴展。

2、執行許可權

為防止惡意腳本的執行,PowerShell有一個執行策略,默認情況下,這個執行策略被設為受限的(Restricted),意味著PowerShell腳本無法執行,你可以使用下面的cmdlet命令確定當前的執行策略:
Get-ExecutionPolicy 你可以選擇使用的執行策略有:
Restricted -腳本不能運行。 RemoteSigned - 本地創建的腳本可以運行,但從網上下載的腳本不能運行(除非它們擁有由受信任的發布者簽署的數字簽名)。 AllSigned – 僅當腳本由受信任的發布者簽名才能運行。 Unrestricted –腳本執行不受限制,不管來自哪裡,也不管它們是否有簽名。
你可以使用下面的cmdlet命令設定PowerShell的執行策略:
Set-ExecutionPolicy

3、運行腳本

如果你想從命令行運行一個執行檔,多年來一個永恆不變的方法是,在命令行轉到該執行檔案所在的位置,然後鍵入該執行檔案的名稱,但這個古老的方法卻不能適用於PowerShell可執行腳本了。
如果你想執行一個PowerShell腳本,通常必須鍵入完整的路徑和檔案名稱,例如,假設你要運行一個名為a.ps1的腳本,你可以鍵入:
C:\Scripts\aps1 最大的例外是,如果PowerShell腳本檔案剛好位於你的系統目錄中,那么你可以直接在命令提示符後鍵入腳本檔案名稱即可運行,如:
.\a.ps1 注意前面需要加上.\,這和Linux下執行Shell腳本的方法如出一轍。

4、管道

管道的作用是將一個命令的輸出作為另一個命令的輸入,兩個命令(或cmdlet)之間只需要用管道符號(|)連線即可。
為了幫助你了解管道是如何工作的,我們以一個例子進行說明,假設你想創建運行在伺服器上的進程列表,並按進程的ID號進行排序,可以使用Get-Process cmdlet命令獲得進程列表,但默認情況下列表不會排序,如果將這個cmdlet命令的輸出用管道輸送給Sort-Object ID命令,進程列表將會按進程ID號進行排序,如:
Get-Process | Sort-Object ID

5、變數

雖然可以使用管道將一個命令的輸出輸送給另一個命令,但管道本身也是有限制的,當你用管道從一個命令向另一個命令傳遞輸出結果時,輸出結果立即被使用,但有時候,你可能需要保存輸出結果一段時間,以便以後可以使用(或重用),這個時候管道就應該下場,輪到變數上場了。
人們很容易將變數想像成一個倉庫,但在PowerShell中,變數可以保存命令的完整輸出,例如,假設你想保存伺服器處於運行中的進程列表,你可以將它賦給一個變數,如:
$a = Get-Process 在這裡,變數被命名為$a,如果你想使用這個變數,只需要簡單地調用它的名稱即可,例如,鍵入$a便可在螢幕上列印變數的內容。
你可以將多個用管道連線的命令的最終輸出賦給一個變數,只需要用一對小括弧將命令括起來即可,例如,假設你想按進程ID對運行中的進程進行排序,然後將結果輸出給一個變數,你可以使用下面這個命令:
$a = (Get-Process | Sort-Object ID)

6、@符號

通過使用@符號,你可以將列表內容轉換成一個數組,例如,下面的代碼創建了一個名為$Procs的變數,它包含多行文本內容(一個數組):$procs = @{name="explorer","svchost"}
使用變數時你也可以使用@符號,為了確保它作為數組而不是單個值處理,例如,下面的代碼將在我前面定義的變數上運行Get-Process cmdlet命令:
Get-Process @procsWindows將顯示Windows資源管理器和Svchost使用的所有進程,注意變數前使用的@符號,而不是常見的$符號。

7、Split

Split操作符根據你指定的字元拆分一個文本字元串,例如,假設你想將一個句子拆分成一個單詞組成的一個數組,你可以使用下面的命令做到:
"This is a test" -split " " 拆分後的結果如下:
This is a test

8、Join

就像Split可以將一個文本字元串拆分成多塊一樣,Join的操作則是逆向的,將多個獨立的塊連線成一個整體,例如,下面這行代碼將會創建一個文本字元串,由我的名字和姓氏組成:
"Brien","Posey" -join " " 命令末尾雙引號之間的空格告訴Windows在兩個文本字元串之間插入一個空格。

9、斷點

運行一個新創建的PowerShell腳本時,如果腳本有Bug,會遇到意想不到的後果,保護自己的一個方法是在腳本的關鍵位置插入斷點,這樣你就可以確保腳本正常運行先,然後再處理可能存在的問題。
插入斷點最簡單的方法是根據行號插入,例如,假設你要在第10行插入一個斷點,可以使用下面的命令:
New-PSBreakpoint -Script C:\Scripts\a.ps1 -Line 10 你也可以將斷點綁定到變數上,如果你希望你的腳本任何時候都可以修改a$的內容,可以使用下面的命令:
New-PSBreakpoint -Script C:\scripts\a.ps1 -variables a 注意,我在變數名後並沒有包括美元符號。
可以和PSBreakpoint一起使用的動詞包括New,Get,Enable,Disable和Remove。

10、Step

調試一個腳本時,有時可能需要逐行運行腳本,這時你可以使用Step-Into cmdlet命令,它會使腳本一行一行地執行,不管有沒有設定斷點,如果你想從這種步進式運行模式退出來,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令後,斷點仍然有效。
順便說一句,如果你的腳本使用了函式,你可能對Step-Out cmdlet更感興趣,Step-Out的工作方式和Step-Into一樣,不過,如果調用了一個函式,Windows不會逐步執行,整個函式將會一次性執行。

優缺點

優點

PowerShell v3將在PowerShell上打造管理的大部分,也提供GUI管理選項以及命令行自動化。v3引入了一些相當重要的新功能。

更好的遠程處理

PowerShell遠程已經逐漸成為在網路上進行管理通信的主要渠道。越來越多的GUI管理控制台將依賴遠程,因此加強PowerShell遠程對微軟很重要。現在能夠斷開遠程會話,稍後能從同個或不同的計算機重新連線到相同的會話。客戶端計算機崩潰的話,v3的社區技術預覽版不能斷開會話。相反,會話會永久關閉。所以這與遠程桌面完全不同,遠程桌面會話能在客戶端崩潰時配置並打開會話。

工作流

本質上,PowerShell新的工作流構建能寫入與功能類似的東西,使用PowerShell翻譯命令和腳本代碼到Windows工作流技術WWF進程中。WWF然後能管理整個任務,包括修復網路故障與重啟計算機等。它是編排長期運行的、複雜的、多步驟任務的更有效更可靠的一種方式。如果這個功能與下一個版本的System Center Orchestrator集成。

可更新的幫助

PowerShell與幫助檔案中的錯誤做鬥爭。微軟需要發布一個作業系統補丁。基於TechNet站點的線上幫助的存在減輕了這個問題,但杯水車薪。在v3中,幫助檔案能按需更新,從任何微軟伺服器都可下載新的XML檔案。所以微軟就能根據找到的問題進行錯誤修復,不需要作業系統包或補丁。

預定任務

owerShell v2引入了job,遵循的是job隨著時間擴展的理念。在v3中,新型job即scheduled job能被創建並按計畫運行,或者相應某個事件。這與Windows的Task Scheduler的區別只是其中一小點,不過最終用戶能從PowerShell中獲得這個功能。

更好的發現

關於命令行shell的一個困難部分在於如何使用。PowerShell的幫助系統很有用,需要提供用戶想知道的命令的名字,並提供命令所在的外掛程式名字,並記得載入附屬檔案到記憶體中。而PowerShell v3在搜尋命令時,包含所有安裝模組的所有命令,shell會運行沒有裝載的命令。這只能在那些存儲在列於PSModulePath環境變數中的檔案路徑中的模組有用。如果要包含額外路徑,可以在任何時候修改變數。

額外功能:CIM

PowerShell與Windows管理規範WMI運作很好,WMI是微軟的一項技術,或多或少建立在標準的通用信息模組CIM上。在PowerShell v3中,WMI cmdlet發揮餘熱,加入到新的CIM cmdlet集中。功能看起來似乎有重疊:CIM cmdlet使用WS-MAN,這個協定位於PowerShell的Remoting功能,微軟管理功能的新標準的後面。WMI使用被微軟正式棄用的DCOM,意味著不會再開發新功能,但可一直使用。CIM是未來的方向,不僅有對已知WMI的額外開發,而且在未來還可跨平台管理

缺點

PowerShell v3
新的Hyper-V 3.0 cmdlets不能管理老版本的Hyper-V。這意味著管理員根據Hyper-V的不同必須採用不同的腳本去管理,直至完成所有宿主機的升級。
Hyper-V 3.0和老版本不兼容。使用老版本Hyper-V的管理員需要從CodePlex下載PowerShell Library for Hyper-V。

創建事件日誌

管理員可以使用PowerShell創建一個新的事件日誌,還可以查看事件日誌的狀態。
管理員可以使用PowerShell輕鬆地添加一個新的事件日誌,例如,可以使用下面的代碼創建一個名為TestSource的新的應用程式事件日誌。
New-EventLog -LogName Application -Source TestSource
如果將信息寫入該Windows事件日誌中只需要調用EventLog的WriteEntry方法。具體代碼如下:
Write-EventLog -LogName Application -EventId 1234 -Source TestSource -Message "Test write"
另外,你還可以通過使用Windows PowerShell快速查看關鍵Windows事件日誌的配置狀態和事件的數量。
Get-EventLog cmdlet里提供了-List參數,可顯示出每個事件日誌檔案最大值和OverflowAction,以及日誌的數量。
下面看一則實例,輸入cmdlet,按返回鍵得出以下內容:
PS C:\> Get-EventLog -List
Max(K) Retain OverflowAction Entries Log
------ ------ -------------- ------- ---
512 7 OverwriteOlder 149 ACEEventLog
20,480 0 OverwriteAsNeeded 38,796 Application
20,480 0 OvjerwriteAsNeeded 0 HardwareEvents
512 7 OverwriteOlder 0 Internet Explorer
20,480 0 OverwriteAsNeeded 0 Key Management Service
15,360 0 OverwriteAsNeeded 12,655 Operations Manager
20,480 0 OverwriteAsNeeded 36,084 Security
20,480 0 OverwriteAsNeeded 23,408 Systemb
15,360 0 OverwriteAsNeeded 18,305 Windows PowerShell

PowerShell 5.0

Windows PowerShell 5.0中包含了大量的新特性和新功能,提升了整體的用戶體驗。

遠程檔案編輯功能

管理員暫時可以通過PowerShell建立與另一個Windows伺服器的遠程會話。新的遠程檔案編輯功能在此基礎之上進行構建,從而能夠建立一個遠程會話,然後在遠程計算機上編輯檔案。

期望狀態配置

PowerShell期望狀態配置(DSC)是2013年下半年發布的Windows 8.1Windows Server 2012 R2最終版本中默認自帶的一個功能。它是一個基於標準Web服務的配置管理系統,允許你按照自己的方式對機器進行配置。
對於不熟悉期望狀態配置的用戶來說,改善後的功能允許管理員對比Windows伺服器的期望狀態,如果伺服器出現問題並偏離了理想的配置,利於管理員及時採取修正措施。期望狀態配置功能已經存在一段時間了,但微軟添加了一個新的參數。新參數允許對期望狀態配置功能設定節流閥限制。該理念在於期望狀態配置功能通常與大量伺服器同時運行。這樣做會消耗大量的系統資源。節流閥限制允許管理員限制期望狀態配置的並發數量,從而限制系統資源消耗。
也許PowerShell 5.0最受歡迎的一個變化是其接口——不是命令集。批評人士認為Windows PowerShell的複製貼上功能可以產生一些不可預知的結果。微軟已經完全修改了複製和貼上的工作方式。
PowerShell期望狀態配置內置於Windows Server,所以它沒有購買許可和系統管理、配置部署軟體管理實例的額外開支。b
PowerShell期望狀態配置幾乎不需要代理,需求只是安裝好PowerShell,並且可以通過80或者443連線埠查詢Web伺服器來抓取配置信息,這裡不需要額外的配置系統管理開銷。
PowerShell期望狀態配置看起來只是配置檔案定義的功能。它忽略其他設定,使配置負載更加輕巧和加速其他部署,這樣它就可以定義多個配置和堆疊工d作負載(一台Web伺服器也充當檔案伺服器,並且可以獲取沒有檔案伺服器設定覆蓋的Web伺服器的設定),這類部署是許多系統管理套件無法很容易地應付,甚至完全不能處理。

Push模式和Pull模式的配置

PowerShell DSC的基本原則是使用定義所需配置的兩種模式,這樣管理員既可以自定義地有間隔地使機器從中央存儲庫獲取正確配置信息,也可以將這類信息推送回去。
Push模式是一個主動的配置模式運行方式,當你發出“Start-DscConfiguration –Computername –Path”的PowerShell命令並且鍵入的命令帶有“-Path”的屬性時,就會立即觸發存在任何位置的基於檔案存儲的系統配置推送出去。這幾乎是一種即時執行“現在就做”的方式來管理你放在中央存儲位置的所有配置檔案目標和需求,這些檔案可以讓你計畫的目標機器去訪問。這個需要你設定經常去觸發推動,並且默認配置不會自己檢測。
Pull模式有一點點被動;它需要一台伺服器同時為配置檔案和其它為計算機各方面配置充當中介角色的構件提供清算服務。舉個例子,在你編v寫一個自定義服務提供程式——可以提供使用PowerShell DSC的一段代碼——它可以轉換本地自定義業務應用程式的配置檔案中的指令。Pull伺服器只是一台運行IIS的伺服器,而IIS可以發布OData。OData是一種典型、明確定義以及標準支持的界面,通過這個界面PowerShell的Web 伺服器可以獲取到真正的配置數據。因此,Pull模式是實施PowerShell DSC最常用的方式,也可以用來部署當配置遠離期望狀態並且逾時的情況。PowerShell DSC定期運行,下發正確的配置,執行靜默的進程來更改配置為期望狀態。
以上的這些配置定義都集成在管理對象檔案或者MOF 檔案,基本上都是一些文本檔案,像一系列的classes,或者是一些PowerShell 配置引擎可以讀懂的與Windows作業系統有關的一些元素,抑或是一些可以定義期望配置的classes參數。這裡提供一些.MvOF配置行檔案的參考:
instance of PowerPlan as $PP
{
ResourceID = "[PowerPlan] Default::[BaseServer]JustTheBasics::[VirtualServer]VMWare";
SourceInfo = "C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\SELocalConfiguration\\StackExchangeConfiguration\\StackExchangeConfiguration.psm1::20::5::PowerPlan";
Name = "High performance";
ModuleName = "PowerPlan";
ModuleVersion = "1.0";
};
MOF檔案通常是手動建立一次,然後根據需求進行複製和貼上。對於檢測這個配置涉及的安裝、移除或者確保某些Windows角色和功能是否已經存在,你可以使用內置命令Get-DscResource來檢測。這個命令會根據你所以給出的角色或者功能名稱,抓取出它們的正確使用語法和其他可用選項。例如,如運行上面的命令,就會顯示PowerShell期望狀態配置可以操作的“區域”配置類型,你可以在每個區域裡面執行這一類的任務和任務指令。
Name Properties
---- ----------
File {DestinationPath, Attributes, Checksum, Con...
Archive {Devstination, Path, Checksum,z Credential...}
Environment {Name, DependsOn, Ensure, Path...}
Group {GroupName, Credential, DependsOn, Descript...
Log {Message, DependsOn}
Package {Name, Path, ProductId, Arguments...}
Registry {Key, ValueName, DependsOn, Ensure...}
Script {GetScript, SetScript, TestScript, Credenti...
Service {Name, BuiltInAccovunt, Credential, DependsO...
User {UserName, DependsOn, Description, Disabled...
WindowsFeature {Name, Credential, DependsOn, Ensure...}
WindowsProcess {Arguments, Path, Credential, DependsOn...}
正如你所看到的,這裡有關於作業系統各方面的屬性,從角色和功能到腳本、註冊設定、認證,你都可以使用DSC來做控制。
這些都是PowerShell期望狀態配置的基本要素。獲取更多信息,查詢PowerShell.org,特別是有標記的DSC資源

在遠程伺服器上運行

Windows Power Shell在用戶管理和維護Windows方面是一個強大的命令行環境。雖然Windows Power Shell是一個本地管理工具,但是它也用於管理遠程伺服器。事實上,管理員可以針對大量的伺服器創建Windows Power Shell腳本來執行管理任務。Invoke-Command和New-PSSession都是在遠程伺服器中Windows Power Shell的執行命令。

Invoke-Command

如果你只需要針對單台或者多台遠程v伺服器執行一個Windows Power Shell命令(或者一系列的管道命令),那么最便利的方法就是Windows Power Shell使用Invoke-Command命令。Microsoft的文檔列出了絕大多數的參數和語法,導致人人皆知Invoke-Command命令的複雜性。即使如此,使用Invoke-Command在遠程系統上執行Windows Power Shell命令仍然出奇地容易。
對於基本的Windows Power Shell遠程命令執行,你只需要提供遠程計算機的名稱和想要執行的代碼塊。假設你想要在名稱為Production1的遠程伺服器上執行Get-VM命令,你可以使用下面的Windows Power Shell命令:
Invoke-Command –ComputerName Production1 {Get-VM}
雖然Windows Power Shell看起來很簡單,但是你也要對使用這個方法了解以下幾點。
首先,Invoke-Command命令不限制你在一個遠程系統上執行命令,你可以在多個計算機上指定命令,你需要做的就是使用命令區分開這些計算機的名稱。例如,在Production1,Production2和Production3計算機上執行命令如下:
Invoke-Command –ComputerName Production1, Production2, Production3 {Get-VM}
第二點,你必須要知道雖然這個方式的設計目的只是簡單地在單個遠程系統上運行的單一Windows Power Shell命令,但是你也可以運行多個Windows Power Shell命令。如果查看之前的Windows Power Shell幾行代碼,你會注意到允許在遠程計算機上運行的Get-VM命令是包含在花括弧裡面的。任何在花括弧裡面的Windows Power Shell命令都會在指定的遠程計算機行運行。同樣的,只要所有的Windows Power Shell命令都包含在花括弧裡面,你可以使用管道符號把Windows Power Shell命令把它們連結在一起。
第三點你必須知道上面的Windows Power Shell語法只有在所有計算機中使用了Kerberos認證才會運行,同時包括有命令輸入和已經加入了域。否則,你必須使用HTTPS傳輸,並且必須指定遠程系統是受信任的主機。

New-PSSession

New-PSSession通常用於在遠程系統上執行Windows Power Shell命令。Invoke-Command命令設計於用於在遠程系統上執行單一Windows Power Shell命令(或者一連串的Windows Power Shell命令),而New-PSSession實際上是用於在遠程伺服器上重定向PowerShell。實質上,你輸入的任何Windows Power Shell命令都會自動傳送到遠程機器上運行。
例如Invoke-Command命令,這裡有許多不同的New-PSSession命令變數,你可以從Microsoft官網文檔中尋找這些變數。
這個命令如此簡易,它只要求提供遠程計算機的名稱。例如,如果你想和名為Production1的計算機建立一個會話,你可以使用以下Windows Power Shell命令:
New-PSSession –ComputerName Production1
這個Windows Power Shell命令會與指定的計算機建立會話,但是它不會自動重定向任何你在遠程計算機輸入的執行PowerShell命令;原因是Microsoft並不限制你只使用一個遠程會話。你可能需要和多個不同的伺服器建立回話。因此,輸入上述命令建立一個Windows Power Shell會話,PowerShell會提供確認的會話,也會羅列出一個會話ID號,但僅此而已。
如果你想要使用遠程會話,那么你將不得不使用另一個名為 Enter-PSSession的Windows Power Shell,只是簡單地附屬檔案上你想連線到會話ID號即可。例如,如果有一個連線到Production1,且會話ID為列名1的New-PSSession會話,你就可以輸入一下命令來連線這個會話:
Enter-PSSession 1
當你在使用這個Windows Power Shell命令時,PowerShell會提示你為這個遠程系統更改一個相關的名稱,這樣你就可以很輕鬆地跟蹤你正在傳送命令的系統了。
並且,你需要確保使用了Kerberos認證,所有的系統都已經加入了域。否則,想要建立遠程會話,你需要多加幾個額外的步驟。
正如你所見到的,PowerShell讓遠程伺服器上的命令執行更加容易,尤其是當你所有的伺服器和工作站屬於同一個域時。

註銷RDP

Windows Power Shell已經不是一個新的問題了:終端Windows Power Shell用戶通過遠程桌面協定登錄到一台Windows伺服器後忘記退出,然後繼續消耗伺服器上的資源。這時,你可以使用Windows Power Shell腳本來強制終端用戶註銷並釋放這些資源。
Windows Power Shell為了強迫用戶註銷遠程桌面協定(RDP)會話,管理員必須首先了解該伺服器上所有遠程桌面服務(RDS)伺服器會話,並查看它們的狀態。檢測所有服務均下線後,下一步才是強制下線。
下載Windows Power Shell模組PSTerminalServices,並確保在你的Windows Power Shell環境中可以使用。所有的安裝說明都可在PSTerminalServices站點獲得。
第一步,我要用這個Windows Power Shell模組來檢查是否能得到實驗室伺服器HYPERV上的所有會話活動(圖1.1)。
圖1.1. Get-TSSession -ComputerName HYPERV
Windows Power Shell(PowerShell)
圖1.1
此時,只有幾個Windows Power Shell會話處於斷開狀態。所以,可以看到所有的Windows Power Shell會話,但是只是想看到那些下線的Windows Power Shell。要做到這一點,將添加State參數(圖1.2)。
圖1.2. Get-TSSession -ComputerName HYPERV -State Disconnected
Windows Power Shell(PowerShell)
圖1.2
這個Windows Power Shell方法很有用,但是仍然有一個問題。會話0不是一個RDP會話,無法用Get-TSSession將其從結果列表中刪除。這時,使用Where-Object來刪除該會話(圖1.3)。
圖1.3. Get-TSSession -ComputerName HYPERV -State Disconnected | where { $_.SessiocnID -ne 0 }
Windows Power Shell(PowerShell)
圖1.3
可以看到所有想停止的Windows Power Shell會話。接下來,只需要停止這些Windows Power Shell會話。要做到這一點,要知道PSTerminalServices模組提供了Stop-TSSession cmdlet,可以幫你停止Windows Power Shell會話(圖1.4)。
圖1.4. Get-TSSession -ComputerName HYPERV -State Disconnected | where {$_.SessionID -ne 0} | Stop-TSSession
Windows Power Shell(PowerShell)
圖1.4
Stop-TSSession cmdlet結束Windows Power Shell會話後可能會導致最終用戶丟失工作內容,因此會提示管理員。這裡可以點擊“A”繼續下一步,但有時管理員不喜歡彈出Windows Power Shell提示信息。如果將這些放在一個更大的Windows Power Shell腳本中,提示將中斷Windows Power Shell腳本。最好的辦法是省略提示。
Stop-TSSession cmdlet有一個通用的Windows Power Shell參數,叫做–Force,Windows Power Shell允許管理員執行操作時沒有任何確認信息打擾。
Get-TSSession -ComputerName HYPERV -State Disconnected | where {$_.SessionID -ne 0} | Stop-TSSession -Force
如果Windows Power Shell沒有輸出,說明Windows Power Shell會話已成功註銷。

管理多個伺服器

對於使用Windows Power Shell及以上版本的大型微軟套用軟體環境下的系統管理員,很有可能日常都會面臨管理Windows Power Shell角色管理的問題。Windows Power Shell伺服器允許管理員通過點擊功能視窗按鈕來增加、刪除或修改系統角色和功能,但是點擊功能視窗大部份操作對於管理員來說不是自動完成的。這就是Windows Power Shell發揮作用的地方。
Windows Power Shell服務管理器是一個單獨創建的用於管理伺服器標識和系統信息的圖形化用戶界面(GUI)區域。Windows Power Shell通過管理接口允許管理員針對某個服務,Windows Power Shell通過點擊功能鍵執行各種工作。雖然這種方法適合用於小規模的套用環境,但Windows Power Shell不適合大規模集群下的套用環境。通過Windows Power Shell命令行的方式就以簡化這些操作。
Windows Power Shell有一個叫“ServFerManager”的模組,它包含了許多可以幫助管理系統角色和功能的命令(圖2.1)。
圖2.1. Windows Power Shell服務管理模組
Windows Power Shell(PowerShell)
圖2.1
將以2個別名和5個實際的Windows Powfer Shell命令和函式為例。為了更簡潔,在文章中我們將直接使用這些命令/函式名字。開始之前,使用“Get-Windows Feature”命令確認系統中所有可用的系統角色和功能。
當不加參數地使用“Gevt-Windows Feature”命令,Windows Power Shell會輸出系統中所有的系統角色和功能—不論Windows Power Shell是否在系統中安裝。圖2.2展示了在測試系統中的一些可用的功能。
圖2.2. 以“Get-Windows Feature”命令的一些選項為例
Windows Power Shell(PowerShell)
圖2.2
Windows Power Shell對於系統中已經安裝系統功能,可以使用“Where-Object”命令查看。
如果想安裝一個新的Windows Power Shell系統功能,應怎樣做呢?可以使用“Install-Windows Feature”命令。例如想在我的本地伺服器上安裝SNMP服務,我可以使用“Install-Windows Feature”命令並且加上名字參數。如圖2.5表示Windows Power Shell功能服務已安裝完成。
圖2.4. SNMP服務功能已安裝完成
Windows Power Shell(PowerShell)
圖2.4
可以使用“Remove-Windows Feature”命令來刪除某些Windows Power Shell系統功能。刪除Windows Power Shell系統功能就像安裝Windows Power Shell某個功能一樣容易,即加上命令的Name參數就行。
圖2.5. 使用“Remove-Windows Feature”命令刪除Windows Power Shell系統下的某個功能
Windows Power Shell(PowerShell)
圖2.5
在圖形化界面操作時需注意必須重啟Windows Power Shell伺服器才能完成刪除某個系統功能。如果使用Windows Power Shell命令腳本的方式,可以不通過手動操作完成。“Install-Windows Feature”和“Remove-W?indows Feature”命令都有“remove”參數。如果有必要,Windows Power Shell可以執行完命令後自動重啟伺服器。
如果只有一台單獨的Windows Power Shell伺服器,本地化操作沒有問題,但是可以通過使用Windows Power Shell服務管理器以相似的方式對多台Windows Power Shell伺服器進行操作管理。使用Windows Power Shell遠程管理功能,管理員可以使用“Computername”參數指定對遠程任一個伺服器進行操作,如圖2.6:
圖2.6. 使用ComputerName參數用於指定執行任務的遠程伺服器
Windows Power Shell(PowerShell)
圖2.6
如果想同時在100台Windows Power Shell伺服器上安裝一個Windows Power Shell系統功能應該怎樣操作呢?如果把伺服器信息寫入一個文本檔案中後,這就不是問題。如果在服務端有一個包含了Windows Power Shell伺服器名字CSV檔案,可以使用Windows Power Shell import命令來讀取csv檔案內容並且可以並發執行任何對Windows Power Shell系統功能的操作命令。
Import-Csv C:\Servers.csv | foreach { Install-WindowsFeature -Name 'SNMP-Service' -ComputerName $_.ServerName }
以上的命令可以從CSV檔案中讀取每個Windows Power Shell伺服器名並且同時在每台伺服器安裝上SNMP服務。

控制IT許可權

在Windows Power Shell受攻擊面方面,IT安全專家經常談論的話題是Windows Power Shell伺服器和應用程式。儘管Windows Power Shell的大部分安全工作都是為了強化作業系統和應用程式以減少可能的受攻擊面,但是有可能IT員工自己本身會成為受攻擊面。
很多Windows Power Shell網路攻擊利用了惡意軟體來獲取受害者系統的訪問許可權。像很多其他的軟體一樣,Windows Power Shell惡意軟體也會受限於當前的安全環境。比如說,一個擁用基本Windows Power Shell用戶許可權的用戶不小心運行了一個惡意軟體會比一個管理員運行這個惡意軟體帶來的損壞小得多。
IT專家長期接受移除管理員Windows Power Shell許可權來提高安全性的方法,但是剝奪所有IT員工的管理員Windows Power Shell許可權並不是一個實用的方法。IT員工一定要有相應必需的Windows Power Shell許可權來執行他們的工作。
這就是需要用到Just Enough Administration的地方了。Just Enough Administration( JEA) 是一個Windows Power Shell工具包來幫助企業組織限制管理員許可權,以提供自身Windows Power Shell整體安全性。
JEA是一種基於角色的訪問控制形式。主要的方法是精確地授予IT員工他們工作必需的Windows Power Shell許可權,不多也不少。即使如此,JEA也和傳統的基於Windows Power Shell身份的訪問控制不一樣,傳統的訪問控制是基於一份詳盡的許可權集合。而相比之下,JEA是基於限制某個用戶能運行的Windows Power Shell然後限制用戶以管理員的身份連線目標伺服器。
這就引出了一個Windows Power Shell問題,即一個標準用戶如何在沒有Windows Power Shell許可權的情況下去執行Windows Power Shell任務呢?理解它工作原理的關鍵在於,要意識到用戶從來不會直接登入伺服器控制台。用戶會登錄進一個標準的工作站,然後使用JEA PowerShell工具包與被管理的Windows Power Shell伺服器建立遠程會話。用戶登入的時候會使用自己被限制的Windows Power Shell賬號密碼,但操作的時候會利用Run As賬戶來執行任何需要Windows Power Shell更高許可權的操作。
從表面上看,如果使用Run As賬戶這種方式並不會比直接給用戶賬號授予Windows Power Shell許可權更好。但是這兩種賬號之間有非常重要的區別:一個被賦予Windows Power Shell許可權的用戶賬號基本上算是一個域管理員。使用JEA 的Run As賬戶是被管理伺服器本地的。這個賬戶不會有域管理許可權,這也意味著這個用戶不能通過網路進行Windows Power Shell管理員授權的傳遞。
Just Enough Administration PowerShell工具包不僅僅依賴對用戶賬號的創新使用來提高安全性,它同時也限制了用戶允許執行的Windows Power Shell。這可以保證用戶可以運行他工作需要的cmdlets,但是不會有額外的cmdlets。
Just Enough Administration包含了創建一個到被Windows Power Shell管理伺服器的遠程會話。Windows Power Shell遠程會話可以通過會話配置檔案或者腳本來進行限制。Just Enough Administration工具包運行允許這些限制以簡單的文本檔案來配置,這可以控制Windows Power Shell用戶被授權運行哪些PowerShell cmdlets。Just Enough Administration工具包同時也可以被設定執行審計的功能。那樣的話,如果一個Windows Power Shell用戶嘗試非授權的行為,這個行為會被阻止並且記錄下來以待查看。
Just Enough Administration工具包可以很大程度上地提供企業內部的安全性,Windows Power Shell用戶只能執行某些設定好的管理員任務。使用這個工具集的最大缺點是它是面向Windows Power Shell的。Windows Power Shell可以作為一款管理工具來使用,但是使用它需要用戶進行一定時間的學習。

期望狀態配置-DSC

Windows Power Shell期望狀態配置(DSC)是2013年下半年發布的Windows 8.1和Windows Server 2012 R2最終版本中默認自帶的一個功能。Windows Power Shell是一個基於標準Web服務的配置管理系統,Windows Power Shell允許你按照自己的方式對機器進行配置,介紹什麼是Windows Power Shell DSC,並將展示它是如何工作的,以及Windows Power Shell可以完成怎樣的任務,達到怎樣的目標。
許多管理員第一次聽說Windows Power Shell工具時就想了解關於Windows Power Shell的一些背景和問題:在試驗或真實系統管理解決方案如System Center或者其他第三方工具上使用Windows Power Shell期望狀態配置的意義是什麼?其有很多優勢,但是其中有三點是最為突出的。
Windows Power Shell期望狀態配置內置於Windows Server,所以Windows Power Shell沒有購買許可和系統管理、配置部署軟體管理實例的額外開支。
Windows Power Shell期望狀態配置幾乎不需要代理,需求只是安裝好Windows Power Shell,並且可以通過80或者443連線埠查詢Web伺服器來抓取配置信息,這裡不需要額外的配置系統管理開銷。
Windows Power Shell期望狀態配置看起來只是配置檔案定義的功能。Windows Power Shell忽略其他設定,使配置負載更加輕巧和加速其他部署,這樣Windows Power Shell就可以定義多個配置和堆疊工作負載(一台Web伺服器也充當檔案伺服器,並且Windows Power Shell可以獲取沒有檔案伺服器設定覆蓋的Web伺服器的設定),這類部署是許多系統管理套件無法很容易地應付,甚至完全不能處理。
Push模式和Pull模式
Windows Power Shell DSC的基本原則是使用定義所需配置的兩種模式,這樣管理員既可以自定義地有間隔地使機器從中央存儲庫獲取正確配置信息,也可以將這類Windows Power Shell信息推送回去。
Windows Power Shell的Push模式是一個主動的配置模式運行方式,當你發出的Windows Power Shell命令並且鍵入的命令帶有“-Path”的屬性時,Windows Power Shell就會立即觸發存在任何位置的基於檔案存儲的系統配置推送出去。這幾乎是一種即時執行“現在就做”的方式來管理你放在中央存儲位置的所有配置檔案目標和需求,這些檔案可以讓你計畫的目標機器去訪問。這個需要你設定經常去觸發Windows Power Shell推動,並且默認配置不會自己檢測。
Windows Power Shell的Pull模式有一點點被動;Windows Power Shell需要一台伺服器同時為配置檔案和其它為計算機各方面配置充當中介角色的構件提供清算服務。舉個例子,在你編寫一個自定義服務提供程式——可以提供使用Windows Power Shell DSC的一段代碼——Windows Power Shell可以轉換本地自定義業務應用程式的配置檔案中的指令。Windows Power Shell的Pull伺服器只是一台運行IIS的伺服器,而IIS可以發布OData。OData是一種典型、明確定義以及標準支持的界面,通過這個界面Windows Power Shell的Web 伺服器可以獲取到真正的配置數據。因此,Pull模式是實施Windows Power Shell DSC最常用的方式,也可以用來部署當配置遠離期望狀態並且逾時的情況。Windows Power Shell DSC定期運行,下發正確的配置,執行靜默的進程來更改配置為期望狀態。
以上的Windows Power Shell配置定義都集成在管理對象檔案或者MOF 檔案,基本上都是一些文本檔案,像一系列的classes,或者是一些Windows Power Shell 配置引擎可以讀懂的與Windows作業系統有關的一些元素,抑或是一些可以定義期望配置的classes參數。
Windows Power Shell的MOF檔案通常是手動建立一次,然後根據需求進行複製和貼上。Windows Power Shell對於檢測這個配置涉及的安裝、移除或者確保某些Windows角色和功能是否已經存在,你可以使用內置命令Get-DscResource來檢測。這個Windows Power Shell命令會根據你所以給出的角色或者功能名稱,抓取出它們的正確使用語法和其他可用選項。
這些都是Windows Power Shell期望狀態配置的基本要素。

控制NTFS許可權

儘管Windows Power Shell包含一系列本地用來配置存儲的cmdlet,但配置NTFS許可權的能力明顯有限。幸運的是,微軟提供了一種利用Windows Power Shell來檢索和配置NTFS許可權的方法,但是你需要提前下載並安裝一個Windows Power Shell專用模組。
所需的模組是檔案系統安全Windows Power Shell模組。將檔案複製到Windows Power Shell模組資料夾中的NTFSSecurity資料夾下。默認情況下,Windows Power Shell模組資料夾路徑
將Windows Power Shell模組複製到相應的資料夾後,可以通過使用下面的Windows Power Shell命令來驗證模組的可用性
假設NTFS模組出現在列表里,
記住,除非你已經利用Set-ExecutionPolicy cmdlet更改了伺服器的執行策略,否則上面這條Windows Power Shell命令將生成一個錯誤訊息,告訴你系統上的Windows Power Shell腳本是禁止運行的。
輸入執行策略後,你就擁有NTFS許可權了。
然而,每次需要使用許可權的時候都必須輸入NTFSSecurity模組。
假設我在伺服器上創建了資料夾C:\Data 。接著,假如想查看這個Windows Power Shell資料夾的訪問控制列表條目,
上面命令列出每個訪問資料夾的賬戶/安全組訪問許可權、套用許可權、許可權類型以及IsInherited和InheritedFrom標誌(見圖3.1)。
Windows Power Shell(PowerShell)
圖3.1
圖3.1. 通過Windows Power Shell查看NTFS許可權
授予Windows Power Shell資料夾訪問許可權與查看現有許可權一樣簡單。你需要使用Add-NTFSAccess cmdlet。另外還需要指定路徑、賬戶和訪問許可權。這裡使用例子說明。假設“Everyone”都能安全訪問到C:\Data資料夾。
現在,我已經添加了Windows Power Shell許可權,讓每個人都能訪問C:\Data,並且利用Get-NTFSAccess cmdlet驗證許可權(圖3.2)。
Windows Power Shell(PowerShell)
圖3.2
圖3.2. Windows Power Shell任何人可訪問
即使能夠將Windows Power Shell許可權授權給所有人,通常來說必須確認Windows Power Shell賬戶位置(圖3.2)。例如,一些已有的許可權位置為BUILTIN或NT AUTHORITY。在實際操作中,通常會指定一個Windows Power Shell連帶用戶組名或用戶名的域名。例如,如果你想授權訪問Contoso域中的Finance組,那么賬戶名為Contoso\Finance。
Windows Power Shell刪除NTFS許可權有點棘手。接著上面的例子,你必須確認Windows Power Shell路徑、賬戶名稱以及打算刪除的Windows Power Shell許可權。
該Windows Power Shell命令有點棘手的原因在於,你無法刪除Windows Power Shell繼承許可權。而且,刪除的Windows Power Shell許可權必須與分配給該帳戶的Windows Power Shell許可權準確匹配。如果匹配失誤,則命令無效。
因為有時難以完全精準匹配許可權,所以使用幾個命令一起刪除許可權會更加方便。假如你想刪除C:\Data資料夾Everyone的所有許可權,不必手工匹配許可權,你可以使用Windows Power Shell讀取該許可權然後進行刪除該。
如果你想從整個Windows Power Shell資料夾樹中刪除許可權,可以遞歸使用該命令(圖3.3)。
Windows Power Shell(PowerShell)
圖3.3
圖3.Windows Power Shell 刪除Everyone許可權

PowerShell的作用

PowerShell中包含了大量的新特性和新功能,PowerShell提升了整體的用戶體驗。雖然PowerShell中一些功能只能供硬核PowerShell開發人員使用,但PowerShell其他新功能和特性具有廣泛的適用性
PowerShell另一個改善的功能是期望狀態配置。對於不熟悉PowerShell期望狀態配置的用戶來說,PowerShell改善後的功能允許管理員對比Windows伺服器的期望狀態,如果PowerShell伺服器出現問題並偏離了理想的配置,利於管理員及時採取修正措施。

PowerShell節流閥限制

PowerShell新版中的期望狀態配置功能語法與以前版本相同,但有一點差異。微軟已經引入了一個名為–ThrottleLimit的命令行開關。PowerShell命令行開關後跟隨期望狀態配置操作所需的最大數量

PowerShell細微變化

PowerShell中複製貼上存在的一個大問題是,如果你選擇多行代碼複製,PowerShell會單獨複製每行,PowerShell不會複製整個代碼塊。例如,如果你複製一條長達四行的命令,然後貼上到PowerShell界面,PowerShell會在每行之間插入換行符,這會導致錯誤信息
PowerShell接口的另一個惱人的問題是,如果你縮放視窗,一部分命令有時會被隱藏到視窗的邊界之外。在PowerShell中,縮小視窗時其中的文本不會發生隱藏,並且適應新視窗的大小。

免費的PowerShell資源與工具

PowerGUI

PowerGUI,由Quest Software公司研發(戴爾的一部分),基本上是一個GUI,開發PowerShell腳本時,圍繞PowerShell提供更多的可見性以及附加功能。PowerGUI無疑為我們提供了一些重要的特性,可以幫助我們創建和編輯PowerShell腳本。
PowerGUI中一個有用的部分是代碼片段。代碼片段是可重複利用的代碼塊,編寫代碼時很容易將它們插入腳本。試想一下如下的場景,你會發現自己在腳本上重複輸入類似的代碼。例如,聲明函式是開發代碼片段的一個主要目標。
下一個有用的部分PowerGUI稱之為變數探針。變數探針允許在腳本中擴展和審視你所使用的局部變數。想知道哪個屬性或方法需要使用特定對象?動態變數探針允許你查看這些屬性,連同腳本中同一界面相應的值。變數探針可以真正地節省時間。
接下來我們看看升級包擴展。這些升級包本質上說是給你一個表示各自應用程式的圖形,可以只用滑鼠逐字地編寫腳本。例如,使用虛擬化升級包,你可以在一個樹類型接口瀏覽虛擬機和主機,並生成不同的腳本報告以及管理你的環境。除了vSphere之外,你還可以找到集中在Active Directory、SQL、Sharepoint的擴展。
最後,還有選項卡完成和語法高亮顯示。相比其他,這雖然不是一個龐大的功能,但很受開發人員歡迎。除了命令中的顯示卡完成,通過自動顯示選項卡完成呈現給我們需要尋找的參數,一切都變得簡單。在高亮顯示方面,PowerGUI強調類似的語法,使腳本更容易閱讀並且能更容易地識別不同區域。

管理腳本編輯器

大多數PowerShell腳本編寫僅僅基於文本並在PowerShell控制台執行。即便如此,有時我希望可以在一些腳本中包裝一個GUI,與他人共享腳本,幫助那些對“命令行”不太精通的人。
在PowerShell上創建GUI不是為了意志薄弱的人——通常它產生數百行代碼,需要在螢幕上負責控制的地方指定值x和y軸的值。之後,你還要完成在控制中添加事件處理程式和操作的艱巨任務。值得慶幸的是,有一個應用程式可以為我們做這一切,在一個很好的拖放界面。該應用程式被稱為管理腳本編輯器(ASE)。
ASE的歷史是獨一無二的。它曾經是一個付費的、完全支持腳本編輯的應用程式,然而,當其他編輯器上市,ASE決定關閉商店並免費發布最終版本。ASE和PowerGUI一樣,也是一個腳本編輯器和開發環境,在PowerShell腳本中創建GUI包裝和形式時,我傾向於僅僅使用它。ASE有一個獨特的拖放界面,允許你輕鬆地設計包含不同控制項的形式,比如文本框、下拉組合框日曆日期選擇器等。除此之外,它還創建了點擊更改事件的功能按鈕和輸入。

PowerCLI社區

對於所有PowerCLI網站來說,虛擬化網站上的PowerCLI社區網站資源最豐富。在這裡你可以找到所有PowerCLI文檔的連結,可以下載並在論壇上提問。從我的經驗可以告訴你,在這個論壇上提問,從來沒有置之不理的情況。當天得到問題回復是很常見的。除了破壞或修復,以及提問信息,論壇還包含一個文檔部分,包括100種以上不同的腳本,虛擬化員工以及合作夥伴和客戶都曾參與編寫,這些腳本可供大家下載。在PowerCLI社區,你應該可以找到任何需要的東西。

Project Onyx

在PowerCLI上執行一個特定任務,需要想出一些合適的語法很困難嗎?你知道如何完成vSphere客戶機的任務嗎?如果是這樣,Onyx項目可以幫助你。Onyx項目在虛擬化中很受歡迎,基本上充當vSphere客戶機和vCenter伺服器之間的代理伺服器。運行和安裝Onyx很簡單,可以在vSphere客戶機上執行任務。Onyx會將所有已經完成的操作轉化為vCO Javascript或虛擬化 PowerCLI/PowerShell語法。在這裡你可以簡單複製代碼、修改和使用。Onyx項目很棒,當你試圖弄清楚如何在PowerCLI完成特定的vSphere任務但卻無能為力時,它可以幫你一把。

Google

無論是谷歌還是其他你鐘情的搜尋引擎,它都可以提供幫助。儘管谷歌不是實際的PowerCLI資源,索引器和網關可以幫助你找到數以百萬計的腳本,這些腳本在網際網路論壇、部落格,、項目和網站隨處可見。PowerShell和PowerCLI的好處是簡單易讀,進而使他們容易理解,但更重要的是具有可編輯性。

自動化伺服器

Windows Power Shell是微軟Windows作業系統中一款強大的操作工具。Windows Power Shell的版本隨Windows的發布而更新。
Windows Power Shell帶來了很多有助於管理員的新功能,最顯著的是增強了自動化功能。讓我們一起來看看Windows Power Shell是如何通過自動化讓Windows伺服器管理員的生活變得簡單的。

建立

Windows Power Shell裝載Windows Server 2012 R2安裝鏡像的USB 3.0隨身碟,以及由Windows系統映像管理器創建的XML檔案。

設定

Windows Power Shell伺服器需要靜態IP位址,但設定起來比較麻煩。使用Windows Power Shell第三方工具可以簡化這一過程。雖然有點冗長,但遠比Netsh命令更具可讀性。
Windows Power Shell在網卡上設定一個靜態的DNS伺服器地址只需要使用第三方工具。Windows Power Shell只需要知道分配給哪個網卡以及DNS伺服器的IP位址

相關詞條

熱門詞條

聯絡我們