Perbedaan antara Windows PowerShell 5.1 dan PowerShell 7.x

Windows PowerShell 5.1 dibangun di atas .NET Framework v4.5. Dengan dirilisnya PowerShell 6.0, PowerShell menjadi proyek sumber terbuka yang dibangun di .NET Core 2.0. Berpindah dari .NET Framework ke .NET Core memungkinkan PowerShell untuk menjadi solusi lintas platform. PowerShell berjalan di Windows, macOS, dan Linux.

Ada beberapa perbedaan dalam bahasa PowerShell antara Windows PowerShell dan PowerShell. Perbedaan yang paling menonjol adalah dalam ketersediaan dan perilaku cmdlet PowerShell antara platform Windows dan non-Windows dan perubahan yang berasal dari perbedaan antara .NET Framework dan .NET Core.

Artikel ini merangkum perbedaan yang signifikan dan melanggar perubahan antara Windows PowerShell dan versi PowerShell saat ini. Ringkasan ini tidak menyertakan fitur atau cmdlet baru yang telah ditambahkan. Artikel ini juga tidak membahas apa yang berubah antar versi. Tujuan dari artikel ini adalah untuk menyajikan status PowerShell saat ini dan bagaimana hal itu berbeda dari Windows PowerShell. Untuk diskusi terperinci tentang perubahan antara versi dan penambahan fitur baru, lihat artikel Apa yang Baru untuk setiap versi.

.NET Framework vs .NET Core

PowerShell di Linux dan macOS menggunakan .NET core, yang merupakan subset dari .NET Framework lengkap di Microsoft Windows. Ini signifikan karena PowerShell menyediakan akses langsung ke jenis dan metode kerangka kerja yang mendasar. Akibatnya, skrip yang berjalan pada Windows mungkin tidak berjalan pada platform non-Windows karena perbedaan dalam kerangka kerja. Untuk informasi selengkapnya tentang perubahan di .NET Core, lihat Melanggar perubahan untuk migrasi dari .NET Framework ke .NET Core.

Setiap rilis baru PowerShell dibangun pada versi .NET yang lebih baru. Mungkin ada perubahan mencolok di .NET yang memengaruhi PowerShell.

  • PowerShell 7.3 - Dibangun di .NET 7.0
  • PowerShell 7.2 (LTS-current) - Dibangun di .NET 6.0 (LTS-current)
  • PowerShell 7.1 - Dibangun di .NET 5.0
  • PowerShell 7.0 (LTS) - Dibangun di .NET Core 3.1 (LTS)
  • PowerShell 6.2 - Dibangun di .NET Core 2.1
  • PowerShell 6.1 - Dibangun di .NET Core 2.1
  • PowerShell 6.0 - Dibangun di .NET Core 2.0

Dengan munculnya .NET Standard 2.0, PowerShell dapat memuat banyak modul Windows PowerShell tradisional tanpa modifikasi. Selain itu, PowerShell 7 menyertakan fitur Kompatibilitas Windows PowerShell yang memungkinkan Anda menggunakan modul Windows PowerShell yang masih memerlukan kerangka kerja lengkap.

Untuk informasi selengkapnya, lihat:

Modul tidak lagi dikirim dengan PowerShell

Untuk berbagai alasan kompatibilitas, modul berikut tidak lagi disertakan dalam PowerShell.

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

Alur Kerja PowerShell

Alur Kerja PowerShell adalah fitur dalam Windows PowerShell yang dibangun di atas Windows Workflow Foundation (WF) yang memungkinkan pembuatan runbook yang kuat untuk tugas yang berjalan lama atau paralel.

Karena kurangnya dukungan untuk Windows Workflow Foundation di .NET Core, kami menghapus PowerShell Workflow dari PowerShell.

Di masa mendatang, kami ingin mengaktifkan paralelisme/konkurensi asli dalam bahasa PowerShell tanpa perlu PowerShell Workflow.

Jika ada kebutuhan untuk menggunakan titik pemeriksaan untuk melanjutkan skrip setelah OS dimulai ulang, sebaiknya gunakan Penjadwal Tugas untuk menjalankan skrip pada startup OS, tetapi skrip harus mempertahankan statusnya sendiri (seperti mempertahankannya ke file).

Cmdlet dihapus dari PowerShell

Untuk modul yang disertakan dalam PowerShell, cmdlet berikut dihapus dari PowerShell karena berbagai alasan kompatibilitas atau penggunaan API yang tidak didukung.

CimCmdlets

  • Export-BinaryMiLog

Microsoft.PowerShell.Core

  • Add-PSSnapin
  • Export-Console
  • Get-PSSnapin
  • Remove-PSSnapin
  • Resume-Job
  • Suspend-Job

Microsoft.PowerShell.Diagnostics

  • Export-Counter
  • Import-Counter

Microsoft.PowerShell.Management

  • Add-Computer
  • Checkpoint-Computer
  • Clear-EventLog
  • Complete-Transaction
  • Disable-ComputerRestore
  • Enable-ComputerRestore
  • Get-ComputerRestorePoint
  • Get-ControlPanelItem
  • Get-EventLog
  • Get-Transaction
  • Get-WmiObject
  • Invoke-WmiMethod
  • Limit-EventLog
  • New-EventLog
  • New-WebServiceProxy
  • Register-WmiEvent
  • Remove-Computer
  • Remove-EventLog
  • Remove-WmiObject
  • Reset-ComputerMachinePassword
  • Restore-Computer
  • Set-WmiInstance
  • Show-ControlPanelItem
  • Show-EventLog
  • Start-Transaction
  • Test-ComputerSecureChannel
  • Undo-Transaction
  • Use-Transaction
  • Write-EventLog

Microsoft.PowerShell.Utility

  • Convert-String
  • ConvertFrom-String

PSDesiredStateConfiguration

  • Disable-DscDebug
  • Enable-DscDebug
  • Get-DscConfiguration
  • Get-DscConfigurationStatus
  • Get-DscLocalConfigurationManager
  • Publish-DscConfiguration
  • Remove-DscConfigurationDocument
  • Restore-DscConfiguration
  • Set-DscLocalConfigurationManager
  • Start-DscConfiguration
  • Stop-DscConfiguration
  • Test-DscConfiguration
  • Update-DscConfiguration

Cmdlet WMI v1

Cmdlet WMI v1 berikut dihapus dari PowerShell:

  • Register-WmiEvent
  • Set-WmiInstance
  • Invoke-WmiMethod
  • Get-WmiObject
  • Remove-WmiObject

Cmdlet modul CimCmdlets (alias WMI v2) melakukan fungsi yang sama dan menyediakan fungsionalitas baru dan sintaks yang didesain ulang.

New-WebServiceProxy cmdlet dihapus

.NET Core tidak mendukung Windows Communication Framework, yang menyediakan layanan untuk menggunakan protokol SOAP. Cmdlet ini dihapus karena membutuhkan SOAP.

*-Transaction cmdlet dihapus

Cmdlet ini memiliki penggunaan yang sangat terbatas. Keputusan dibuat untuk menghentikan dukungan bagi mereka.

  • Complete-Transaction
  • Get-Transaction
  • Start-Transaction
  • Undo-Transaction
  • Use-Transaction

*-EventLog Cmdlet

Karena penggunaan API yang tidak didukung, *-EventLog cmdlet telah dihapus dari PowerShell. Get-WinEvent dan New-WinEvent tersedia untuk mendapatkan dan membuat peristiwa di Windows.

Cmdlet yang menggunakan Windows Presentation Framework (WPF)

.NET Core 3.1 menambahkan dukungan untuk WPF, sehingga rilis PowerShell 7.0 memulihkan fitur khusus Windows berikut:

  • Cmdlet Show-Command
  • Cmdlet Out-GridView
  • Parameter ShowWindow dari Get-Help

Perubahan PowerShell Desired State Configuration (DSC)

Invoke-DscResource dipulihkan sebagai fitur eksperimental di PowerShell 7.0.

Dimulai dengan PowerShell 7.2, modul PSDesiredStateConfiguration telah dihapus dari PowerShell dan telah diterbitkan ke Galeri PowerShell. Untuk informasi selengkapnya, lihat pengumuman di blog Tim PowerShell.

Perubahan powerShell yang dapat dieksekusi

Mengganti nama powershell.exe menjadi pwsh.exe

Nama biner untuk PowerShell telah diubah dari powershell(.exe) ke pwsh(.exe). Perubahan ini menyediakan cara deterministik bagi pengguna untuk menjalankan PowerShell pada mesin dan mendukung penginstalan Windows PowerShell dan PowerShell secara berdampingan.

Perubahan tambahan ke pwsh(.exe) dari powershell.exe:

  • Mengubah parameter posisi pertama dari -Command menjadi -File. Perubahan ini memperbaiki penggunaan #! (alias sebagai shebang) dalam skrip PowerShell yang dijalankan dari shell non-PowerShell pada platform non-Windows. Ini juga berarti bahwa Anda dapat menjalankan perintah seperti pwsh foo.ps1 atau pwsh fooScript tanpa menentukan -File. Namun, perubahan ini mengharuskan Anda secara eksplisit menentukan -c atau -Command saat mencoba menjalankan perintah seperti pwsh.exe -Command Get-Command.
  • pwsh-i menerima sakelar (atau -Interactive) untuk menunjukkan shell interaktif. Ini memungkinkan PowerShell digunakan sebagai shell default pada platform Unix.
  • Parameter yang -ImportSystemModules dihapus dan -PSConsoleFile dari pwsh.exe.
  • Bantuan yang diubah pwsh -version dan bawaan untuk pwsh.exe menyelaraskan dengan alat asli lainnya.
  • Pesan kesalahan argumen untuk -File dan -Command dan kode keluar tidak valid yang konsisten dengan standar Unix
  • Menambahkan -WindowStyle parameter pada Windows. Demikian pula, pembaruan penginstalan berbasis paket pada platform non-Windows adalah pembaruan di tempat.

Nama yang dipersingkat juga konsisten dengan penamaan shell pada platform non-Windows.

Dukungan menjalankan skrip PowerShell dengan parameter bool

Sebelumnya, menggunakan pwsh.exe untuk menjalankan skrip PowerShell menggunakan -File tidak ada cara untuk meneruskan $true/$false sebagai nilai parameter. Dukungan untuk $true/$false sebagai nilai yang diurai ke parameter ditambahkan. Nilai switch juga didukung.

Kompatibilitas mundur yang ditingkatkan dengan Windows PowerShell

Untuk Windows, parameter switch baru UseWindowsPowerShell ditambahkan ke Import-Module. Sakelar ini membuat modul proksi di PowerShell 7 yang menggunakan proses Windows PowerShell lokal untuk secara implisit menjalankan cmdlet apa pun yang terkandung dalam modul tersebut. Untuk informasi selengkapnya, lihat Import-Module.

Untuk informasi selengkapnya tentang modul Microsoft mana yang bekerja dengan PowerShell 7.0, lihat Tabel Kompatibilitas Modul.

Dukungan Microsoft Update untuk Windows

PowerShell 7.2 menambahkan dukungan untuk Microsoft Update. Saat mengaktifkan fitur ini, Anda akan mendapatkan pembaruan PowerShell 7 terbaru dalam alur manajemen Windows Update (WU) tradisional Anda, baik itu dengan Windows Update untuk Bisnis, WSUS, SCCM, atau dialog WU interaktif di Pengaturan.

Paket MSI PowerShell 7.2 menyertakan opsi baris perintah berikut:

  • USE_MU - Properti ini memiliki dua nilai yang mungkin:
    • 1 (default) - Memilih untuk memperbarui melalui Microsoft Update atau WSUS
    • 0 - Jangan memilih untuk memperbarui melalui Microsoft Update atau WSUS
  • ENABLE_MU
    • 1(default) - Memilih menggunakan Microsoft Update the Automatic Updates atau Windows Update
    • 0- Jangan ikut serta menggunakan Microsoft Update Updates Otomatis atau Windows Update

Perubahan mesin

Mendukung PowerShell sebagai shell Unix default

Di Unix, ini adalah konvensi bagi shell untuk menerima -i shell interaktif dan banyak alat mengharapkan perilaku ini (script misalnya, dan saat mengatur PowerShell sebagai shell default) dan memanggil shell dengan -i sakelar. Perubahan ini melanggar yang -i sebelumnya dapat digunakan sebagai tangan pendek untuk mencocokkan -inputformat, yang sekarang perlu .-in

Snap-in kustom

Snap-in PowerShell adalah pendahulu modul PowerShell yang tidak memiliki adopsi luas di komunitas PowerShell.

Karena kompleksitas mendukung snap-in dan kurangnya penggunaannya di komunitas, kami tidak lagi mendukung snap-in kustom di PowerShell.

Bendera fitur eksperimental

Dukungan yang diaktifkan PowerShell 6.2 untuk Fitur Eksperimental. Ini memungkinkan pengembang PowerShell untuk memberikan fitur baru dan mendapatkan umpan balik sebelum desain selesai. Dengan cara ini kita menghindari membuat perubahan yang melanggar seiring berkembangnya desain.

Gunakan Get-ExperimentalFeature untuk mendapatkan daftar fitur eksperimental yang tersedia. Anda dapat mengaktifkan atau menonaktifkan fitur-fitur ini dengan Enable-ExperimentalFeature dan Disable-ExperimentalFeature.

Muat perakitan dari jalur dasar modul sebelum mencoba memuat dari GAC

Sebelumnya, ketika modul biner memiliki perakitan modul di GAC, kami memuat perakitan dari GAC sebelum mencoba memuatnya dari jalur dasar modul.

Lewati pemeriksaan null-element untuk koleksi dengan jenis elemen tipe nilai

Mandatory Untuk parameter dan ValidateNotNullValidateNotNullOrEmpty atribut, lewati null-element periksa apakah jenis elemen koleksi adalah jenis nilai.

Pertahankan $? untuk ParenExpression, SubExpression , dan ArrayExpression

PR ini mengubah cara kita mengompilasi subpipeline , subekspresi(...)$(...), dan ekspresi @() array sehingga $? tidak secara otomatis benar. Sebaliknya nilai $? tergantung pada hasil alur atau pernyataan yang dijalankan.

Perbaiki $? agar tidak menjadi $false ketika perintah asli menulis ke stderr

$? tidak diatur ke $false ketika perintah asli menulis ke stderr. Adalah umum bagi perintah asli untuk menulis ke stderr tanpa berniat untuk menunjukkan kegagalan. $? diatur ke $false hanya ketika perintah asli memiliki kode keluar bukan nol.

Membuat $ErrorActionPreference tidak memengaruhi stderr output perintah asli

Adalah umum bagi perintah asli untuk menulis ke stderr tanpa berniat untuk menunjukkan kegagalan. Dengan perubahan ini, stderr output masih diambil dalam objek ErrorRecord , tetapi runtime tidak lagi berlaku $ErrorActionPreference jika ErrorRecord berasal dari perintah asli.

Ubah $OutputEncoding untuk menggunakan UTF-8 NoBOM pengodean daripada ASCII

Pengodean sebelumnya, ASCII (7-bit), akan mengakibatkan perubahan output yang salah dalam beberapa kasus. Membuat UTF-8 NoBOM default mempertahankan output Unicode dengan pengodean yang didukung oleh sebagian besar alat dan sistem operasi.

Menyatukan cmdlet dengan parameter -Encoding menjadi berjenis System.Text.Encoding

Nilai -EncodingByte telah dihapus dari cmdlet penyedia sistem file. Parameter baru, -AsByteStream, sekarang digunakan untuk menentukan bahwa aliran byte diperlukan sebagai input atau bahwa output adalah aliran byte.

Mengubah New-ModuleManifest pengodean ke UTF8NoBOM pada platform non-Windows

Sebelumnya, New-ModuleManifest membuat psd1 manifes di UTF-16 dengan BOM, menciptakan masalah untuk alat Linux. Perubahan yang melanggar ini mengubah pengodean New-ModuleManifest menjadi UTF (tanpa BOM) di platform non-Windows.

Hapus AllScope dari sebagian besar alias default

Untuk mempercepat pembuatan cakupan, AllScope dihapus dari sebagian besar alias default. AllScope dibiarkan untuk beberapa alias yang sering digunakan di mana pencarian lebih cepat.

-Verbose dan -Debug tidak lagi mengambil alih $ErrorActionPreference

Sebelumnya, jika -Verbose atau -Debug ditentukan, itu menimpa perilaku $ErrorActionPreference. Dengan perubahan ini, -Verbose dan -Debug tidak lagi mempengaruhi perilaku $ErrorActionPreference.

Selain itu -Debug , parameter diatur $DebugPreference ke Lanjutkan alih-alih Inquire.

Membuat $PSCulture refleksikan perubahan budaya dalam sesi secara konsisten

Dalam Windows PowerShell, nilai budaya saat ini di-cache, yang dapat memungkinkan nilai untuk tidak sinkron dengan budaya berubah setelah sesi-startup. Perilaku penembolokan ini diperbaiki di inti PowerShell.

Izinkan parameter bernama yang ditentukan secara eksplisit untuk menggantikan parameter yang sama dari percikan hashtable

Dengan perubahan ini, parameter bernama dari splatting dipindahkan ke akhir daftar parameter sehingga terikat setelah semua parameter bernama yang ditentukan secara eksplisit terikat. Pengikatan parameter untuk fungsi sederhana tidak melemparkan kesalahan ketika parameter bernama tertentu tidak dapat ditemukan. Parameter bernama yang tidak diketahui terikat ke $args parameter fungsi sederhana. Memindahkan splatting ke akhir daftar argumen mengubah urutan parameter muncul di $args.

Contohnya:

function SimpleTest {
    param(
        $Name,
        $Path
    )
    "Name: $Name; Path: $Path; Args: $args"
}

Dalam perilaku sebelumnya, MyPath tidak terikat -Path karena ini adalah argumen ketiga dalam daftar argumen. ## Jadi akhirnya diisi menjadi '$args' bersama dengan Blah = "World"

PS> $hash = @{ Name = "Hello"; Blah = "World" }
PS> SimpleTest @hash "MyPath"
Name: Hello; Path: ; Args: -Blah: World MyPath

Dengan perubahan ini, argumen dari @hash dipindahkan ke akhir daftar argumen. MyPath menjadi argumen pertama dalam daftar, sehingga terikat ke -Path.

PS> SimpleTest @hash "MyPath"
Name: Hello; Path: MyPath; Args: -Blah: World

Perubahan bahasa

Operator coalescing null ??

Operator null-coalescing ?? mengembalikan nilai operand sebelah kirinya jika bukan null. Jika tidak, itu mengevaluasi operand tangan kanan dan mengembalikan hasilnya. Operator ?? tidak mengevaluasi operand kanannya apabila operand sebelah kiri mengevaluasi ke non-null.

$x = $null
$x ?? 100
100

Dalam contoh berikut, operand sebelah kanan tidak akan dievaluasi.

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Operator penugasan coalescing null ??=

Operator ??= penugasan null-coalescing menetapkan nilai operand tangan kanannya ke operand sebelah kirinya hanya jika operand sebelah kiri mengevaluasi ke null. Operator ??= tidak mengevaluasi operand kanannya apabila operand sebelah kiri mengevaluasi ke non-null.

$x = $null
$x ??= 100
$x
100

Dalam contoh berikut, operand sebelah kanan tidak akan dievaluasi.

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
1/10/2020

Operator kondisi null

Catatan

Fitur ini dipindahkan dari eksperimental ke mainstream di PowerShell 7.1.

Operator null-conditional menerapkan akses anggota, ?., atau akses elemen, ?[], operasi ke operand-nya hanya jika operand tersebut mengevaluasi ke non-null; jika tidak, itu mengembalikan null.

Karena PowerShell memungkinkan ? untuk menjadi bagian dari nama variabel, spesifikasi formal dari nama variabel diperlukan untuk menggunakan operator ini. Jadi diperlukan untuk menggunakan {} sekitar nama variabel seperti ${a} atau ketika ? merupakan bagian dari nama ${a?}variabel .

Dalam contoh berikut, nilai PropName dikembalikan.

$a = @{ PropName = 100 }
${a}?.PropName
100

Contoh berikut akan mengembalikan null, tanpa mencoba mengakses nama anggota PropName.

$a = $null
${a}?.PropName

Demikian pula, nilai elemen akan dikembalikan.

$a = 1..10
${a}?[0]
1

Dan ketika operand null, elemen tidak diakses dan null dikembalikan.

$a = $null
${a}?[0]

Catatan

Sintaks ${<name>} nama variabel tidak boleh dikacaukan dengan $() operator subekspresi. Untuk informasi selengkapnya, lihat Bagian nama variabel about_Variables.

Menambahkan & operator untuk kontrol pekerjaan

Menempatkan & di akhir alur menyebabkan alur dijalankan sebagai pekerjaan PowerShell. Saat alur di latar belakang, objek pekerjaan dikembalikan. Setelah alur berjalan sebagai pekerjaan, semua cmdlet standar *-Job dapat digunakan untuk mengelola pekerjaan. Variabel (mengabaikan variabel khusus proses) yang digunakan dalam alur secara otomatis disalin ke pekerjaan sehingga Copy-Item $foo $bar & hanya berfungsi. Pekerjaan juga dijalankan di direktori saat ini alih-alih direktori asal pengguna.

Metode/properti baru pada PSCustomObject

Kami telah menambahkan metode dan properti baru ke PSCustomObject. PSCustomObject sekarang termasuk Count/Length properti seperti objek lain.

$PSCustomObject = [pscustomobject]@{foo = 1}

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Pekerjaan ini juga mencakup ForEach metode dan Where yang memungkinkan Anda mengoperasikan dan memfilter PSCustomObject item:

$PSCustomObject.ForEach({$_.foo + 1})
2
$PSCustomObject.Where({$_.foo -gt 0})
foo
---
  1

Konversi dari PSMethod ke Delegasi

Anda dapat mengonversi menjadi PSMethod delegasi. Ini memungkinkan Anda untuk melakukan hal-hal seperti meneruskan PSMethod[M]::DoubleStrLen sebagai nilai delegasi ke dalam [M]::AggregateString:

class M {
    static [int] DoubleStrLen([string] $value) { return 2 * $value.Length }

    static [long] AggregateString([string[]] $values, [func[string, int]] $selector) {
        [long] $res = 0
        foreach($s in $values){
            $res += $selector.Invoke($s)
        }
        return $res
    }
}

[M]::AggregateString((gci).Name, [M]::DoubleStrLen)

Perilaku perbandingan string berubah di PowerShell 7.1

PowerShell 7.1 dibangun di .NET 5.0, yang memperkenalkan perubahan yang melanggar berikut:

Pada .NET 5.0, perbandingan string invarian budaya mengabaikan karakter kontrol non-pencetakan.

Misalnya, dua string berikut dianggap identik:

# Escape sequence "`a" is Ctrl-G or [char]7
'Food' -eq "Foo`ad"
True

Cmdlet baru

Cmdlet Get-Uptime baru

Cmdlet Get-Uptime mengembalikan waktu yang berlalu sejak boot terakhir sistem operasi. Cmdlet diperkenalkan di PowerShell 6.0.

Cmdlet Remove-Alias baru

Cmdlet Remove-Alias menghapus alias dari sesi PowerShell saat ini. Cmdlet diperkenalkan di PowerShell 6.0.

Remove-Service cmdlet baru

Cmdlet Remove-Service menghapus layanan Windows di registri dan di database layanan. Cmdlet Remove-Service diperkenalkan di PowerShell 6.0.

Cmdlet Markdown baru

Markdown adalah standar untuk membuat dokumen teks biasa yang dapat dibaca dengan pemformatan dasar yang dapat dirender ke dalam HTML.

Cmdlet berikut ditambahkan di PowerShell 6.1:

  • ConvertFrom-Markdown - Mengonversi konten string atau file menjadi objek MarkdownInfo .
  • Get-MarkdownOption - Mengembalikan warna dan gaya saat ini yang digunakan untuk merender konten Markdown di konsol.
  • Set-MarkdownOption - Mengatur warna dan gaya yang digunakan untuk merender konten Markdown di konsol.
  • Show-Markdown - Menampilkan konten Markdown di konsol atau sebagai HTML

Cmdlet Test-Json baru

Cmdlet Test-Json menguji apakah string adalah dokumen JavaScript Object Notation (JSON) yang valid dan dapat secara opsional memverifikasi bahwa dokumen JSON terhadap skema yang disediakan.

Cmdlet ini diperkenalkan di PowerShell 6.1

Cmdlet baru untuk mendukung Fitur Eksperimental

Cmdlet berikut ditambahkan di PowerShell 6.2 untuk mendukung Fitur Eksperimental.

Cmdlet Join-String baru

Cmdlet Join-String menggabungkan objek dari alur menjadi satu string. Cmdlet ini ditambahkan di PowerShell 6.2.

Tampilan baru conciseView dan cmdlet Get-Error

PowerShell 7.0 meningkatkan tampilan pesan kesalahan untuk meningkatkan keterbacaan kesalahan interaktif dan skrip dengan tampilan default baru, ConciseView. Tampilan dapat dipilih pengguna melalui variabel $ErrorViewpreferensi .

Dengan ConciseView, jika kesalahan bukan dari kesalahan skrip atau pengurai, maka itu adalah pesan kesalahan baris tunggal:

Get-Childitem -Path c:\NotReal
Get-ChildItem: Cannot find path 'C:\NotReal' because it does not exist

Jika kesalahan terjadi selama eksekusi skrip atau merupakan kesalahan penguraian, PowerShell mengembalikan pesan kesalahan multibaris yang berisi kesalahan, penunjuk, dan pesan kesalahan yang menunjukkan di mana kesalahan berada di baris tersebut. Jika terminal tidak mendukung urutan escape warna ANSI (VT100), maka warna tidak ditampilkan.

Tampilan default di PowerShell 7 adalah ConciseView. Tampilan default sebelumnya adalah NormalView dan Anda dapat memilih ini dengan mengatur variabel $ErrorViewpreferensi .

$ErrorView = 'NormalView' # Sets the error view to NormalView
$ErrorView = 'ConciseView' # Sets the error view to ConciseView

Catatan

Properti baru ErrorAccentColor ditambahkan ke $Host.PrivateData untuk mendukung perubahan warna aksen pesan kesalahan.

Cmdlet baru Get-Errormemberikan tampilan terperinci lengkap tentang kesalahan yang sepenuhnya memenuhi syarat jika diinginkan. Secara default cmdlet menampilkan detail lengkap, termasuk pengecualian dalam, dari kesalahan terakhir yang terjadi.

Get-Error Cmdlet mendukung input dari alur menggunakan variabel $Errorbawaan . Get-Error menampilkan semua kesalahan yang disalurkan.

$Error | Get-Error

Get-Error Cmdlet mendukung parameter Terbaru, memungkinkan Anda menentukan berapa banyak kesalahan dari sesi saat ini yang ingin Anda tampilkan.

Get-Error -Newest 3 # Displays the lst three errors that occurred in the session

Untuk informasi selengkapnya, lihat Get-Error.

Perubahan cmdlet

Eksekusi paralel ditambahkan ke ForEach-Object

Dimulai di PowerShell 7.0, ForEach-Object cmdlet, yang melakukan iterasi item dalam koleksi, sekarang memiliki paralelisme bawaan dengan parameter Paralel baru.

Secara default, blok skrip paralel menggunakan direktori kerja pemanggil saat ini yang memulai tugas paralel.

Contoh ini mengambil 50.000 entri log dari 5 log sistem pada komputer Windows lokal:

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count

50000

Parameter Paralel menentukan blok skrip yang dijalankan secara paralel untuk setiap nama log input.

Parameter ThrottleLimit baru membatasi jumlah blok skrip yang berjalan secara paralel pada waktu tertentu. Bawaan adalah 5.

$_ Gunakan variabel untuk mewakili objek input saat ini di blok skrip. $using: Gunakan cakupan untuk meneruskan referensi variabel ke blok skrip yang sedang berjalan.

Untuk informasi selengkapnya, lihat ForEach-Object.

Periksa system32 modul bawaan yang kompatibel di Windows

Dalam pembaruan Windows 10 1809 dan Windows Server 2019, kami memperbarui sejumlah modul PowerShell bawaan untuk menandainya sebagai kompatibel dengan PowerShell.

Saat PowerShell dimulai, PowerShell secara otomatis disertakan $windir\System32PSModulePath sebagai bagian dari variabel lingkungan. Namun, ini hanya mengekspos modul ke Get-Module dan Import-Module jika CompatiblePSEdition ditandai sebagai kompatibel dengan Core.

Anda dapat mengambil alih perilaku ini untuk menampilkan semua modul menggunakan -SkipEditionCheck parameter pengalihan. Kami juga telah menambahkan PSEdition properti ke output tabel.

-lp alias untuk semua -LiteralPath parameter

Kami membuat alias -lp parameter standar untuk semua cmdlet PowerShell bawaan yang memiliki -LiteralPath parameter .

Perbaiki Get-Item -LiteralPath a*b jika a*b tidak benar-benar ada untuk mengembalikan kesalahan

Sebelumnya, -LiteralPath mengingat kartubebas akan memperlakukannya sama seperti -Path dan jika wildcard tidak menemukan file, kartubebas akan keluar secara diam-diam. Perilaku yang benar haruslah itu -LiteralPath harfiah sehingga jika file tidak ada, itu harus kesalahan. Perubahannya adalah memperlakukan kartubebas yang digunakan sebagai -Literal harfiah.

Atur direktori kerja ke direktori saat ini di Start-Job

Start-Job Cmdlet sekarang menggunakan direktori saat ini sebagai direktori kerja untuk pekerjaan baru.

Hapus -Protocol dari *-Computer cmdlet

Karena masalah dengan akses jauh RPC di CoreFX (terutama pada platform non-Windows) dan memastikan pengalaman akses jauh yang konsisten di PowerShell, -Protocol parameter dihapus dari \*-Computer cmdlet. DCOM tidak lagi didukung untuk remoting. Cmdlet berikut hanya mendukung akses jauh WSMAN:

  • Rename-Computer
  • Restart-Computer
  • Stop-Computer

Hapus -ComputerName dari *-Service cmdlet

Untuk mendorong penggunaan PSRP yang konsisten, -ComputerName parameter dihapus dari *-Service cmdlet.

Perbaikan Get-Content -Delimiter untuk tidak menyertakan pemisah dalam baris yang dikembalikan

Sebelumnya, output saat menggunakan Get-Content -Delimiter tidak konsisten dan tidak nyaman karena memerlukan pemrosesan data lebih lanjut untuk menghapus pemisah. Perubahan ini menghapus pemisah di baris yang dikembalikan.

Perubahan pada Format-Hex

Parameter -Raw sekarang menjadi "no-op" (karena tidak melakukan apa-apa). Ke depannya semua output ditampilkan dengan representasi angka yang benar yang mencakup semua byte untuk jenisnya. Inilah yang -Raw dilakukan parameter sebelum perubahan ini.

Perbaikan kesalahan ketik dalam nama properti Get-ComputerInfo

BiosSerialNumber salah eja karena BiosSeralNumber dan telah diubah ke ejaan yang benar.

Tambahkan Get-StringHash cmdlet dan Get-FileHash

Perubahan ini adalah bahwa beberapa algoritma hash tidak didukung oleh CoreFX, oleh karena itu tidak lagi tersedia:

  • MACTripleDES
  • RIPEMD160

Menambahkan validasi pada Get-* cmdlet di mana passing $null mengembalikan semua objek alih-alih kesalahan

Meneruskan $null ke salah satu hal berikut ini sekarang melemparkan kesalahan:

  • Get-Credential -UserName
  • Get-Event -SourceIdentifier
  • Get-EventSubscriber -SourceIdentifier
  • Get-Help -Name
  • Get-PSBreakpoint -Script
  • Get-PSProvider -PSProvider
  • Get-PSSessionConfiguration -Name
  • Get-Runspace -Name
  • Get-RunspaceDebug -RunspaceName
  • Get-Service -Name
  • Get-TraceSource -Name
  • Get-Variable -Name

Menambahkan dukungan untuk Format File Log Yang Diperluas W3C di Import-Csv

Sebelumnya, Import-Csv cmdlet tidak dapat digunakan untuk langsung mengimpor file log dalam format log yang diperluas W3C dan tindakan tambahan akan diperlukan. Dengan perubahan ini, format log yang diperluas W3C didukung.

Import-CsvPSTypeNames berlaku saat impor ketika informasi jenis ada di CSV

Sebelumnya, objek yang diekspor menggunakan Export-CSV dengan TypeInformation yang diimpor dengan ConvertFrom-Csv tidak menyimpan informasi jenis. Perubahan ini menambahkan informasi jenis ke PSTypeNames anggota jika tersedia dari file CSV.

-NoTypeInformation adalah default pada Export-Csv

Sebelumnya, Export-CSV cmdlet akan menghasilkan komentar sebagai baris pertama yang berisi nama jenis objek. Perubahan mengecualikan informasi jenis secara default karena tidak dipahami oleh sebagian besar alat CSV. Perubahan ini dilakukan untuk mengatasi umpan balik pelanggan.

Gunakan -IncludeTypeInformation untuk mempertahankan perilaku sebelumnya.

Izinkan * untuk digunakan dalam jalur registri untuk Remove-Item

Sebelumnya, -LiteralPath mengingat kartubebas akan memperlakukannya sama seperti -Path dan jika wildcard tidak menemukan file, itu akan keluar secara diam-diam. Perilaku yang benar haruslah itu -LiteralPath harfiah sehingga jika file tidak ada, itu harus kesalahan. Perubahannya adalah memperlakukan kartubebas yang digunakan sebagai -Literal harfiah.

Group-Object sekarang mengurutkan grup

Sebagai bagian dari peningkatan performa, Group-Object sekarang mengembalikan daftar grup yang diurutkan. Meskipun Anda tidak boleh mengandalkan pesanan, Anda dapat dipecah oleh perubahan ini jika Anda menginginkan grup pertama. Kami memutuskan bahwa peningkatan performa ini sepadan dengan perubahan karena dampak tergantung pada perilaku sebelumnya rendah.

Simpantan baku dalam Measure-Object

Output dari Measure-Object sekarang mencakup StandardDeviation properti .

Get-Process | Measure-Object -Property CPU -AllStats
Count             : 308
Average           : 31.3720576298701
Sum               : 9662.59375
Maximum           : 4416.046875
Minimum           :
StandardDeviation : 264.389544720926
Property          : CPU

Get-PfxCertificate -Password

Get-PfxCertificate sekarang memiliki Password parameter , yang mengambil SecureString. Ini memungkinkan Anda untuk menggunakannya secara non-interaktif:

$certFile = '\\server\share\pwd-protected.pfx'
$certPass = Read-Host -AsSecureString -Prompt 'Enter the password for certificate: '

$certThumbPrint = (Get-PfxCertificate -FilePath $certFile -Password $certPass ).ThumbPrint

more Penghapusan fungsi

Di masa lalu, PowerShell mengirimkan fungsi pada Windows yang disebut more yang dibungkus more.com. Fungsi itu sekarang telah dihapus.

Selain itu help , fungsi berubah untuk digunakan more.com pada Windows, atau pager default sistem yang ditentukan oleh $env:PAGER pada platform non-Windows.

cd DriveName: sekarang mengembalikan pengguna ke direktori kerja saat ini di drive tersebut

Sebelumnya, menggunakan Set-Location atau cd untuk kembali ke PSDrive mengirim pengguna ke lokasi default untuk drive tersebut. Pengguna sekarang dikirim ke direktori kerja terakhir yang diketahui saat ini untuk sesi tersebut.

cd - kembali ke direktori sebelumnya

C:\Windows\System32> cd C:\
C:\> cd -
C:\Windows\System32>

Atau di Linux:

PS /etc> cd /usr/bin
PS /usr/bin> cd -
PS /etc>

Selain itu, cd dan cd -- ubah menjadi $HOME.

Update-Help sebagai non-admin

Dengan permintaan populer, Update-Help tidak perlu lagi dijalankan sebagai administrator. Update-Help sekarang default untuk menyimpan bantuan ke folder yang dilingkup pengguna.

Where-Object -Not

Dengan penambahan -Not parameter ke Where-Object, dapat memfilter objek di alur untuk tidak adanya properti, atau nilai properti null/kosong.

Misalnya, perintah ini mengembalikan semua layanan yang tidak memiliki layanan dependen yang ditentukan:

Get-Service | Where-Object -Not DependentServices

Perubahan pada Cmdlet Web

API .NET yang mendasar dari Cmdlet Web telah diubah menjadi System.Net.Http.HttpClient. Perubahan ini memberikan banyak manfaat. Namun, perubahan ini bersama dengan kurangnya interoperabilitas dengan Internet Explorer telah mengakibatkan beberapa perubahan mencolok di dalam Invoke-WebRequest dan Invoke-RestMethod.

  • Invoke-WebRequest sekarang hanya mendukung Penguraian HTML dasar. Invoke-WebRequest selalu mengembalikan BasicHtmlWebResponseObject objek. Properti ParsedHtml dan Forms telah dihapus.
  • BasicHtmlWebResponseObject.Headers nilai sekarang String[] bukan String.
  • BasicHtmlWebResponseObject.BaseResponse sekarang menjadi System.Net.Http.HttpResponseMessage objek.
  • Properti Response pada pengecualian Web Cmdlet sekarang menjadi System.Net.Http.HttpResponseMessage objek.
  • Penguraian header RFC yang ketat sekarang default untuk -Headers parameter dan -UserAgent . Ini dapat dilewati dengan -SkipHeaderValidation.
  • file:// dan ftp:// skema URI tidak lagi didukung.
  • System.Net.ServicePointManager pengaturan tidak lagi dihormati.
  • Saat ini tidak ada autentikasi berbasis sertifikat yang tersedia di macOS.
  • Penggunaan lebih http:// dari -Credential URI akan mengakibatkan kesalahan. https:// Gunakan URI atau berikan -AllowUnencryptedAuthentication parameter untuk menekan kesalahan.
  • -MaximumRedirection sekarang menghasilkan kesalahan yang mengakhiri ketika upaya pengalihan melebihi batas yang disediakan alih-alih mengembalikan hasil pengalihan terakhir.
  • Di PowerShell 6.2, perubahan dilakukan secara default ke pengodean UTF-8 untuk respons JSON. Ketika charset tidak disediakan untuk respons JSON, pengodean default harus UTF-8 per RFC 8259.
  • Pengodean default diatur ke UTF-8 untuk application-json respons
  • Menambahkan -SkipHeaderValidation parameter untuk mengizinkan Content-Type header yang tidak mematuhi standar
  • Menambahkan -Form parameter untuk mendukung dukungan yang disederhanakan multipart/form-data
  • Penanganan kunci hubungan yang sesuai dan tidak peka huruf besar/kecil
  • Menambahkan -Resume parameter untuk cmdlet web

Invoke-RestMethod mengembalikan info yang berguna saat tidak ada data yang dikembalikan

Ketika API kembali hanya null, Invoke-RestMethod sedang menserialisasikan ini sebagai string "null" alih-alih $null. Perubahan ini memperbaiki logika masuk Invoke-RestMethod untuk membuat serialisasi nilai tunggal JSON null yang valid dengan benar sebagai $null.

Cmdlet Web memperingatkan kapan -Credential dikirim melalui koneksi yang tidak terenkripsi

Saat menggunakan HTTP, konten termasuk kata sandi dikirim sebagai teks-jelas. Perubahan ini untuk tidak mengizinkan ini secara default dan mengembalikan kesalahan jika kredensial diteruskan secara tidak aman. Pengguna dapat melewati ini dengan menggunakan sakelar -AllowUnencryptedAuthentication .

Membuat -OutFile parameter dalam cmdlet web berfungsi seperti -LiteralPath

Dimulai di PowerShell 7.1, parameter OutFile cmdlet web berfungsi seperti LiteralPath dan tidak memproses wildcard.

Perubahan API

Hapus AddTypeCommandBase kelas

Kelas AddTypeCommandBase dihapus dari Add-Type untuk meningkatkan performa. Kelas ini hanya digunakan oleh Add-Type cmdlet dan tidak boleh berdampak pada pengguna.

Dihapus VisualBasic sebagai bahasa yang didukung dalam Add-Type

Di masa lalu, Anda dapat mengkompilasi kode Visual Basic menggunakan Add-Type cmdlet . Visual Basic jarang digunakan dengan Add-Type. Kami menghapus fitur ini untuk mengurangi ukuran PowerShell.

Dukungan yang dihapus RunspaceConfiguration

Sebelumnya, saat membuat runspace PowerShell secara terprogram menggunakan API, Anda dapat menggunakan kelas warisan RunspaceConfiguration atau yang lebih InitialSessionState baru. Perubahan ini menghapus dukungan untuk RunspaceConfiguration dan hanya mendukung InitialSessionState.

CommandInvocationIntrinsics.InvokeScript mengikat argumen ke $input alih-alih $args

Posisi parameter yang salah mengakibatkan argumen diteruskan sebagai input alih-alih sebagai argumen.

Hapus ClrVersion properti dan BuildVersion dari $PSVersionTable

Properti ClrVersion$PSVersionTable tidak berguna dengan CoreCLR. Pengguna akhir tidak boleh menggunakan nilai tersebut untuk menentukan kompatibilitas.

Properti BuildVersion terkait dengan versi build Windows, yang tidak tersedia pada platform non-Windows. GitCommitId Gunakan properti untuk mengambil versi build PowerShell yang tepat.

Menerapkan penguraian escape Unicode

`u#### atau `u{####} dikonversi ke karakter Unicode yang sesuai. Untuk menghasilkan literal `u, keluar dari backtick: ``u.

Masalah pengikatan parameter dengan ValueFromRemainingArguments dalam fungsi PS

ValueFromRemainingArguments sekarang mengembalikan nilai sebagai array alih-alih nilai tunggal yang merupakan array.

Membersihkan penggunaan CommandTypes.Workflow dan WorkflowInfoCleaned

Bersihkan kode yang terkait dengan penggunaan CommandTypes.Workflow dan WorkflowInfo di System.Management.Automation.

Perubahan pembobolan kecil ini terutama memengaruhi kode penyedia bantuan.

  • Ubah konstruktor publik menjadi WorkflowInfo internal. Kami tidak mendukung alur kerja lagi, jadi masuk akal untuk tidak mengizinkan orang membuat Workflow instans.
  • Hapus jenis System.Management.Automation.DebugSource karena hanya digunakan untuk penelusuran kesalahan alur kerja.
  • Hapus kelebihan beban SetParent dari Debugger kelas abstrak yang hanya digunakan untuk penelusuran kesalahan alur kerja.
  • Hapus kelebihan beban SetParent yang sama dari kelas turunan RemotingJobDebugger.

Jangan membungkus hasil PSObject pengembalian saat mengonversi ke ScriptBlock delegasi

ScriptBlock Ketika dikonversi ke jenis delegasi yang akan digunakan dalam konteks C#, membungkus hasilnya membawa masalah yang PSObject tidak diperlukan:

  • Ketika nilai dikonversi ke jenis pengembalian delegasi, PSObject pada dasarnya akan dibongkar. PSObject Jadi yang tidak diperlukan.
  • Ketika jenis pengembalian delegasi adalah object, itu akan dibungkus dalam sehingga PSObject sulit untuk bekerja dengan dalam kode C#.

Setelah perubahan ini, objek yang dikembalikan adalah objek yang mendasar.

Dukungan Jarak Jauh

PowerShell Remoting (PSRP) menggunakan WinRM pada platform Unix memerlukan NTLM/Negosiasi atau Autentikasi Dasar melalui HTTPS. PSRP di macOS hanya mendukung Autentikasi Dasar melalui HTTPS. Autentikasi berbasis Kerberos tidak didukung untuk platform non-Windows.

PowerShell juga mendukung PowerShell Remoting (PSRP) melalui SSH di semua platform (Windows, macOS, dan Linux). Untuk informasi selengkapnya, lihat Jarak jauh SSH di PowerShell.

PowerShell Direct untuk Kontainer mencoba menggunakan pwsh terlebih dahulu

PowerShell Direct adalah fitur PowerShell dan Hyper-V yang memungkinkan Anda terhubung ke Hyper-V VM atau Kontainer tanpa konektivitas jaringan atau layanan manajemen jarak jauh lainnya.

Di masa lalu, PowerShell Direct tersambung menggunakan instans Windows PowerShell bawaan pada Kontainer. Sekarang, PowerShell Direct pertama kali mencoba untuk terhubung menggunakan apa pun yang tersedia pwsh.exe pada PATH variabel lingkungan. Jika pwsh.exe tidak tersedia, PowerShell Direct akan kembali menggunakan powershell.exe.

Enable-PSRemoting sekarang membuat titik akhir jarak jauh terpisah untuk versi pratinjau

Enable-PSRemoting sekarang membuat dua konfigurasi sesi jarak jauh:

  • Satu untuk versi utama PowerShell. Contohnya:PowerShell.6 Titik akhir ini yang dapat diandalkan di seluruh pembaruan versi minor sebagai konfigurasi sesi PowerShell 6 "seluruh sistem"
  • Satu konfigurasi sesi khusus versi, misalnya: PowerShell.6.1.0

Perilaku ini berguna jika Anda ingin menginstal beberapa versi PowerShell 6 dan dapat diakses pada komputer yang sama.

Selain itu, versi pratinjau PowerShell sekarang mendapatkan konfigurasi sesi jarak jauh mereka sendiri setelah menjalankan Enable-PSRemoting cmdlet:

C:\WINDOWS\system32> Enable-PSRemoting

Output Anda mungkin berbeda jika Anda belum menyiapkan WinRM sebelumnya.

WinRM is already set up to receive requests on this computer.
WinRM is already set up for remote management on this computer.

Kemudian Anda dapat melihat konfigurasi sesi PowerShell terpisah untuk pratinjau dan build PowerShell 6 yang stabil, dan untuk setiap versi tertentu.

Get-PSSessionConfiguration
Name          : PowerShell.6.2-preview.1
PSVersion     : 6.2
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : PowerShell.6-preview
PSVersion     : 6.2
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : powershell.6
PSVersion     : 6.1
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

Name          : powershell.6.1.0
PSVersion     : 6.1
StartupScript :
RunAsUser     :
Permission    : NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed

user@host:port sintaks yang didukung untuk SSH

Klien SSH biasanya mendukung string koneksi dalam format user@host:port. Dengan penambahan SSH sebagai protokol untuk PowerShell Remoting, kami telah menambahkan dukungan untuk format string koneksi ini:

Enter-PSSession -HostName fooUser@ssh.contoso.com:2222

Telemetri hanya dapat dinonaktifkan dengan variabel lingkungan

PowerShell mengirimkan data telemetri dasar ke Microsoft saat diluncurkan. Data ini mencakup nama OS, versi OS, dan versi PowerShell. Data ini memungkinkan kami untuk lebih memahami lingkungan tempat PowerShell digunakan dan memungkinkan kami memprioritaskan fitur dan perbaikan baru.

Untuk menolak telemetri ini, atur variabel POWERSHELL_TELEMETRY_OPTOUT lingkungan ke true, yes, atau 1. Kami tidak lagi mendukung penghapusan file DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY untuk menonaktifkan telemetri.