Aracılığıyla paylaş


Windows PowerShell 5.1 ile PowerShell 7.x arasındaki farklar

Windows PowerShell 5.1, .NET Framework v4.5'in üzerine kurulmuştur. PowerShell 6.0 sürümüyle PowerShell, .NET Core 2.0 üzerinde oluşturulmuş bir açık kaynak projesi haline geldi. .NET Framework'ten .NET Core'a geçiş, PowerShell'in platformlar arası bir çözüm haline gelmesine izin verdi. PowerShell, Windows, macOS ve Linux üzerinde çalışır.

Windows PowerShell ile PowerShell arasında PowerShell dilinde birkaç fark vardır. En önemli farklar, Windows ve Windows dışı platformlar arasındaki PowerShell cmdlet'lerinin kullanılabilirliği ve davranışı ile .NET Framework ile .NET Core arasındaki farklardan kaynaklanan değişikliklerdir.

Bu makalede, Windows PowerShell ile PowerShell'in geçerli sürümü arasındaki önemli farklar ve önemli değişiklikler özetlemektedir. Bu özet, eklenen yeni özellikleri veya cmdlet'leri içermez. Bu makalede sürümler arasında nelerin değiştiği de anlatılmaz. Bu makalenin amacı, PowerShell'in geçerli durumunu ve bunun Windows PowerShell'den ne kadar farklı olduğunu sunmaktır. Sürümler arasındaki değişiklikler ve yeni özelliklerin eklenmesiyle ilgili ayrıntılı bir tartışma için, her sürüm için Yenilikler makalelerine bakın.

.NET Framework ile .NET Core karşılaştırması

Linux ve macOS üzerinde PowerShell, Microsoft Windows üzerinde tam .NET Framework'ün bir alt kümesi olan .NET core'u kullanır. PowerShell temel alınan çerçeve türlerine ve yöntemlerine doğrudan erişim sağladığından bu önemli bir durumdur. Sonuç olarak, Windows üzerinde çalışan betikler, çerçevelerdeki farklılıklar nedeniyle Windows dışı platformlarda çalışmayabilir. .NET Core'daki değişiklikler hakkında daha fazla bilgi için, .NET Framework'ten .NET Core'a geçişteki önemli değişiklikler bölümüne bakın.

PowerShell'in her yeni sürümü daha yeni bir .NET sürümü üzerine kurulmuştur. .NET'te PowerShell'i etkileyebilecek köklü değişiklikler olabilir.

  • PowerShell 7.5 - .NET 9.0 üzerinde oluşturulmuş
  • PowerShell 7.4 - .NET 8.0 üzerinde oluşturulmuş
  • PowerShell 7.3 - .NET 7.0 üzerinde oluşturulmuş
  • PowerShell 7.2 (LTS-current) - .NET 6.0 (LTS-current) üzerine kurulmuştur
  • PowerShell 7.1 - .NET 5.0 üzerinde oluşturulmuş
  • PowerShell 7.0 (LTS) - .NET Core 3.1 (LTS) üzerine kurulmuştur
  • PowerShell 6.2 - .NET Core 2.1 üzerine kurulmuştur
  • PowerShell 6.1 - .NET Core 2.1 üzerine kurulmuştur
  • PowerShell 6.0 - .NET Core 2.0 üzerinde oluşturulmuş

.NET Standard 2.0'ın ortaya çıkmasıyla, PowerShell birçok geleneksel Windows PowerShell modülünü değişiklik yapmadan yükleyebilir. Ayrıca PowerShell 7, tam çerçeve gerektiren Windows PowerShell modüllerini kullanmanıza olanak tanıyan bir Windows PowerShell Uyumluluğu özelliği içerir.

Daha fazla bilgi için bkz.:

.NET yöntemi değişikliklerine dikkat edin

.NET yöntemi değişiklikleri PowerShell'e özgü olmasa da, özellikle .NET yöntemlerini doğrudan çağırıyorsanız betiklerinizi etkileyebilir. Ayrıca, yapıcılar için yeni aşırı yüklemeler olabilir. Bunun, New-Object veya [type]::new() yöntemini kullanarak nesneleri oluşturma şekliniz üzerinde etkisi olabilir.

Örneğin .NET, .NET Framework 4.5'te bulunmayan aşırı yüklemeleri [System.String]::Split() yöntemine ekledi. Aşağıdaki listede, Windows PowerShell 5.1'de kullanılabilen yöntemin Split() aşırı yüklemeleri gösterilmektedir:

PS> "".Split

OverloadDefinitions
-------------------
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

Aşağıdaki listede PowerShell 7'de kullanılabilen yöntemin Split() aşırı yüklemeleri gösterilmektedir:

"".Split

OverloadDefinitions
-------------------
string[] Split(char separator, System.StringSplitOptions options)
string[] Split(char separator, int count, System.StringSplitOptions options)
string[] Split(Params char[] separator)
string[] Split(char[] separator, int count)
string[] Split(char[] separator, System.StringSplitOptions options)
string[] Split(char[] separator, int count, System.StringSplitOptions options)
string[] Split(string separator, System.StringSplitOptions options)
string[] Split(string separator, int count, System.StringSplitOptions options)
string[] Split(string[] separator, System.StringSplitOptions options)
string[] Split(string[] separator, int count, System.StringSplitOptions options)

Windows PowerShell 5.1'de bir karakter dizisini (char[]) yöntemine Split() olarak stringgeçirebilirsiniz. yöntemi, dizideki bir karakterin herhangi bir örneğinde hedef dizeyi böler. Aşağıdaki komut, Hedef dizeyi Windows PowerShell 5.1'de böler, ancak PowerShell 7'de bölmez:

# PowerShell 7 example
"1111p2222q3333".Split('pq')
1111p2222q3333

Doğru aşırı yüklemeye bağlanmak için dizeyi bir karakter dizisine yayınlamalısınız:

# PowerShell 7 example
"1111p2222q3333".Split([char[]]'pq')
1111
2222
3333

Modüller artık PowerShell ile gönderilmemiş

Çeşitli uyumluluk nedenleriyle, aşağıdaki modüller artık PowerShell'e dahil değildir.

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

PowerShell İş Akışı

PowerShell İş Akışı , Windows PowerShell'de Windows Workflow Foundation'ın (WF) üzerine inşa edilen ve uzun süre çalışan veya paralelleştirilmiş görevler için sağlam runbook'lar oluşturulmasını sağlayan bir özelliktir.

.NET Core'da Windows Workflow Foundation desteğinin olmaması nedeniyle PowerShell İş Akışı'nı PowerShell'den kaldırdık.

Gelecekte, PowerShell İş Akışına gerek kalmadan PowerShell dilinde yerel paralelliği/eşzamanlılığı etkinleştirmek istiyoruz.

İşletim sistemi yeniden başlatıldıktan sonra bir betiği sürdürmek için denetim noktalarının kullanılması gerekiyorsa, işletim sistemi başlatma sırasında bir betik çalıştırmak için Görev Zamanlayıcı'yı kullanmanızı öneririz, ancak betiğin kendi durumunu (dosyada kalıcı hale getirmek gibi) olması gerekir.

PowerShell'den kaldırılan cmdlet'ler

PowerShell'e dahil edilen modüller için, aşağıdaki cmdlet'ler çeşitli uyumluluk nedenleriyle veya desteklenmeyen API'lerin kullanımından dolayı PowerShell'den kaldırılmıştır.

CimCmdlet'ler

  • 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

WMI v1 cmdlet'leri

Aşağıdaki WMI v1 cmdlet'leri PowerShell'den kaldırıldı:

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

CimCmdlets modülü (diğer adıyla WMI v2) cmdlet'leri aynı işlevi gerçekleştirir ve yeni işlevsellik ve yeniden tasarlanmış bir söz dizimi sağlar.

New-WebServiceProxy cmdlet kaldırıldı

.NET Core, SOAP protokollerini kullanmaya yönelik hizmetler sağlayan Windows Communication Framework'leri desteklemez. Bu cmdlet SOAP gerektirdiği için kaldırıldı.

*-Transaction cmdlet'ler kaldırıldı

Bu cmdlet'lerin kullanımı çok sınırlı. Kendilerine verilen desteğin kesilmesi kararı alınmıştı.

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

*-EventLog cmdlet komutları

Desteklenmeyen API'lerin *-EventLog kullanılması nedeniyle cmdlet'ler PowerShell'den kaldırılmıştır. Get-WinEvent ve New-WinEvent Windows'da olay almak ve oluşturmak için kullanılabilir.

Windows Presentation Framework (WPF) kullanan cmdlet'ler

.NET Core 3.1 WPF desteği ekledi, bu nedenle PowerShell 7.0 sürümü aşağıdaki Windows'a özgü özellikleri geri yükledi:

  • cmdlet'i Show-Command
  • Out-GridView cmdlet
  • ShowWindow parametresiGet-Help

PowerShell İstenen Durum Yapılandırması (DSC) değişiklikleri

Invoke-DscResource PowerShell 7.0'da deneysel bir özellik olarak geri yüklendi.

PowerShell 7.2'den başlayarak PSDesiredStateConfiguration modülü PowerShell'den kaldırılmıştır ve PowerShell Galerisi'nde yayımlanmıştır. Daha fazla bilgi için PowerShell Ekibi blogundaki duyuruya bakın.

PowerShell yürütülebilir değişiklikleri

powershell.exe adı pwsh.exe olarak değiştirildi

PowerShell için ikili ad powershell(.exe)'dan pwsh(.exe) olarak değiştirildi. Bu değişiklik, kullanıcıların Makinelerde PowerShell çalıştırması için belirleyici bir yol sağlar ve Windows PowerShell ve PowerShell'in yan yana yüklemelerini destekler.

powershell.exe'den pwsh(.exe)'ye yapılan ek değişiklikler:

  • İlk konumsal parametre -Command'dan -File'e değiştiriliyor. Bu değişiklik, Windows dışı platformlarda PowerShell dışındaki kabuklardan çalıştırılan PowerShell betiklerinde, shebang olarak da bilinen #! kullanımını düzeltir. Ayrıca gibi pwsh foo.ps1 veya pwsh fooScript belirtmeden -Filekomut çalıştırabileceğiniz anlamına gelir. Ancak, bu değişiklik, pwsh.exe -Command Get-Command gibi komutları çalıştırmaya çalışırken -c veya -Command'i açıkça belirtmenizi gerektirir.
  • pwsh (veya -Interactive) etkileşimli bir kabuğu göstermek için -i anahtarını kabul eder. Bu, PowerShell'in Unix platformlarında varsayılan kabuk olarak kullanılmasını sağlar.
  • -ImportSystemModules ve -PSConsoleFile parametreleri pwsh.exe.'den kaldırıldı.
  • pwsh -Version ve pwsh.exe için yerleşik yardım, diğer yerel araçlarla uyumlu hale getirilmek üzere değiştirildi.
  • -File ve -Command için geçersiz bağımsız değişken hata iletileri ve Unix standartlarıyla tutarlı çıkış kodları.
  • Windows'da parametre eklendi -WindowStyle . Benzer şekilde, Windows olmayan platformlardaki paket tabanlı yükleme güncelleştirmeleri de yerinde güncelleştirmelerdir.

Kısaltılmış ad, Windows dışı platformlarda kabukların adlandırılmasıyla da tutarlıdır.

Bool parametresiyle PowerShell betiğini çalıştırma desteği

Daha önce pwsh.exe ve -File kullanarak bir PowerShell betiği yürütürken $true/$false değerlerini parametre olarak geçirmenin hiçbir yolu yoktu. Parametrelere $true/$false ayrıştırılmış değerler olarak desteği eklendi. Anahtar değerleri de desteklenir.

Windows PowerShell ile geliştirilmiş geriye dönük uyumluluk

Windows için, yeni bir anahtar parametre UseWindowsPowerShellImport-Module'e eklendi. Bu anahtar, PowerShell 7'de, bu modülde yer alan cmdlet'leri örtük olarak çalıştırmak için yerel bir Windows PowerShell işlemi kullanan bir proxy modülü oluşturur. Daha fazla bilgi için bkz. Import-Module.

PowerShell 7.0 ile hangi Microsoft modüllerinin çalıştığı hakkında daha fazla bilgi için bkz. Modül Uyumluluğu Tablosu.

Windows için Microsoft Update desteği

PowerShell 7.2, Microsoft Update desteği ekledi. Bu özelliği etkinleştirdiğinizde, ister İş için Windows Update, WSUS, SCCM ister Ayarlar'daki etkileşimli WU iletişim kutusu olsun, geleneksel Windows Update (WU) yönetim akışınızda en son PowerShell 7 güncelleştirmelerini alırsınız.

PowerShell 7.2 MSI paketi aşağıdaki komut satırı seçeneklerini içerir:

  • USE_MU - Bu özelliğin iki olası değeri vardır:
    • 1 (varsayılan) - Microsoft Update veya WSUS aracılığıyla güncelleştirmeyi kabul eder
    • 0 - Microsoft Update veya WSUS aracılığıyla güncelleştirmeyi kabul etmeyin
  • ENABLE_MU
    • 1 (varsayılan) - Microsoft Update'i Otomatik Güncelleştirmeler'i veya Windows Update'i kullanmayı kabul eder
    • 0 - Microsoft Update'i Otomatik Güncelleştirmeler'i veya Windows Update'i kullanmayı kabul etmeyin

Motor değişiklikleri

PowerShell'i varsayılan Unix kabuğu olarak destekle

Unix'te, etkileşimli bir kabuk için kabukların -i kabul etmesi bir kuraldır ve bir çok araç bu davranışı bekler (script örneğin, PowerShell'i varsayılan kabuk olarak ayarlarken) ve kabuğu -i anahtar ile çağırır. Bu değişiklik, daha önce -i'ın -InputFormat ile eşleşmek için kısayol olarak kullanılabilmesi durumunu bozuyor ki, bu şimdi -in olması gerekiyor.

Özel ek bileşenler

PowerShell ek bileşenleri, PowerShell topluluğunda yaygın olarak benimsenmeyen PowerShell modüllerinin öncüllerinden biridir.

Ek bileşenleri desteklemenin karmaşıklığı ve topluluktaki kullanım yetersizliği nedeniyle artık PowerShell'de özel ek bileşenleri desteklemiyoruz.

Deneysel özellik bayrakları

Deneysel Özellikler için PowerShell 6.2 desteği etkinleştirildi. Bu, PowerShell geliştiricilerinin tasarım tamamlanmadan önce yeni özellikler sunmasına ve geri bildirim almasına olanak tanır. Bu şekilde tasarım geliştikçe hataya neden olan değişiklikler yapmaktan kaçınıyoruz.

Kullanılabilir deneysel özelliklerin listesini almak için kullanın Get-ExperimentalFeature . Bu özellikleri Enable-ExperimentalFeature ve Disable-ExperimentalFeature ile etkinleştirebilir veya devre dışı bırakabilirsiniz.

GAC'den yüklemeye çalışmadan önce modül temel yolundan derlemeyi yükleyin.

Daha önce, bir ikili modül GAC'de modül derlemesine sahip olduğunda, modülü temel yolundan yüklemeye çalışmadan önce derlemeyi GAC'den yüklemiştik.

Değer tipi eleman türüne sahip koleksiyonlar için null eleman kontrolünün atlanması

Mandatory parametresi ve ValidateNotNull ile ValidateNotNullOrEmpty öznitelikleri için, koleksiyonun öğe türü değer türü ise null öğe denetimini atlayın.

ParenExpression, SubExpression ve ArrayExpression için koru $?

Bu çekme isteği, otomatik olarak doğru olmaması için alt diziler (...), alt ifadeler $(...) ve dizi ifadelerini @()$? derleme şeklimizi değiştirir. $? değerinin işlem hattının veya yürütülen deyimlerin sonucuna bağlı olduğu belirtilmelidir.

Yerel komut stderr'ye yazdığında $false olmaması için $? düzeltilir.

$? yerel komut stderr'ye yazdığında $false olarak ayarlanmıyor. Yerel komutların hata belirtme niyeti olmaksızın stderr yazması yaygın bir durumdur. $? yalnızca yerel komutun sıfır olmayan bir çıkış kodu olduğunda olarak ayarlanır $false .

Yerel komutların çıktısını stderr etkilemeyecek şekilde $ErrorActionPreference yapın.

Yerel komutların başarısızlık belirtme amacı olmaksızın stderr'e yazması yaygın bir durumdur. Bu değişiklikle, stderr çıktısı ErrorRecord nesnelerinde yakalanmaya devam eder, ancak ErrorRecord yerel bir komuttan geliyorsa çalışma zamanı artık $ErrorActionPreference uygulamaz.

Değiştir $OutputEncoding'i, ASCII yerine UTF-8 NoBOM kodlaması kullanacak şekilde.

Önceki kodlama olan ASCII (7 bit), bazı durumlarda çıkışın yanlış değiştirilmesine neden olabilir. UTF-8 NoBOM varsayılan olarak ayarlandığında, çoğu araç ve işletim sistemi tarafından desteklenen bir kodlama ile Unicode çıkışını korur.

Cmdlet'leri parametre -Encoding türünde olacak şekilde birleştirin System.Text.Encoding

FileSystem sağlayıcısının cmdlet'lerinden -Encoding değeri Byte kaldırılmıştır. Giriş olarak bayt akışının gerekli olduğunu veya çıkışın bir bayt akışı olduğunu belirtmek için artık yeni bir parametresi -AsByteStreamkullanılır.

Windows dışı platformlarda kodlamayı UTF8NoBOM olarak değiştirme New-ModuleManifest

New-ModuleManifest Daha önce BOM ile UTF-16'da bildirimler oluşturarak psd1 Linux araçları için bir sorun oluşturuyor. Bu uyumsuzluk yaratan değişiklik, Windows dışı platformlarda New-ModuleManifest kodunu BOM'suz UTF olarak değiştirir.

Çoğu varsayılan takma adlardan AllScope'i kaldır.

Kapsam oluşturmayı hızlandırmak için çoğu varsayılan addan AllScope kaldırıldı. AllScope aramanın daha hızlı olduğu birkaç sık kullanılan takma ad için bırakıldı.

-Verbose ve -Debug artık $ErrorActionPreference'yi geçersiz kılmıyor

Daha önce, -Verbose veya -Debug belirtilmişse, $ErrorActionPreference'nin davranışını geçersiz kılıyordu. Bu değişiklikle -Verbose ve -Debug artık davranışını $ErrorActionPreferenceetkilemez.

Ayrıca -Debug parametreyi $DebugPreference.

$PSCulture Oturum içi kültür değişikliklerini tutarlı bir şekilde yansıtma

Windows PowerShell'de geçerli kültür değeri önbelleğe alınır ve kültür oturum başladıktan sonra değiştiğinde bu değer senkronize dışı kalabilir. Bu önbelleğe alma davranışı PowerShell çekirdeğinde düzeltildi.

Açıkça belirtilmiş adlandırılmış bir parametrenin, hashtable splatting'den gelen aynı parametreden üstün gelmesine izin ver

Bu değişiklikle, açıkça belirtilen tüm adlandırılmış parametreler bağlandıktan sonra bağlı olmaları için, splatting'den adlandırılmış parametreler parametre listesinin sonuna taşınır. Belirtilen adlandırılmış parametre bulunamadığında basit işlevler için parametre bağlaması hata oluşturmaz. Bilinmeyen adlandırılmış parametreler, basit işlevin parametresine bağlıdır $args . Bağımsız değişken listesinin sonuna sıçrayarak parametrelerin içinde $argsgörünme sırasını değiştirir.

Örneğin:

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

Önceki davranışta MyPath, bağımsız değişken listesindeki üçüncü bağımsız değişken olduğundan -Path'e bağlı değildir. ## Böylece '$args' ile birlikte içine yerleştirilir Blah = "World"

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

Bu değişiklikle, bağımsız değişkenler @hash’den bağımsız değişken listesinin sonuna taşınır. MyPath listedeki ilk bağımsız değişken olur, bu nedenle öğesine -Pathbağlıdır.

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

Dil değişiklikleri

Null birleşim işleci ??

null birleşim işleci ??, null değilse sol tarafındaki işlenenin değerini döndürür. Aksi takdirde sağ işlenenini değerlendirir ve sonucunu geri döndürür. Eğer sol operand null değilse, ?? operatörü sağ operandı kontrol etmez.

$x = $null
$x ?? 100
100

Aşağıdaki örnekte sağ işlenen değerlendirilmez.

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

Null birleştirici atama operatörü ??=

Null birleşim atama işleci ??=, sol işlenen yalnızca null olduğunda, sağ işlenenin değerini sol işlenenine atar. Eğer sol operand null değilse, ??= operatörü sağ operandı kontrol etmez.

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

Aşağıdaki örnekte sağ işlenenin değerlendirilmesi yapılmayacaktır.

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

Null koşullu işleçler

Uyarı

Bu özellik PowerShell 7.1'de deneyselden temele taşındı.

Null koşullu işleç; bir üye erişimi, ?. veya öğe erişimi, ?[] işlevini yalnızca işlenen null değilse uygular; aksi takdirde null döner.

PowerShell ? değişken adının bir parçası olmasını sağladığından, bu işleçleri kullanmak için değişken adının resmi belirtimi gerekir. Bu nedenle, ${a} gibi değişken adlarının veya ${a?} bir değişken adının parçası olduğunda, bu adların etrafında {} kullanılması gerekir.

Aşağıdaki örnekte, PropName değeri döndürülür.

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

Aşağıdaki örnek, PropName üye adına erişmeye çalışmadan null döndürür.

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

Benzer şekilde, öğesinin değeri döndürülür.

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

İşlenen null olduğunda, öğeye erişilmez ve null döndürülür.

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

Uyarı

${<name>} değişken adı sözdizimini, $() alt ifade işleciyle karıştırmamalıdır. Daha fazla bilgi için about_Variablesdeğişken adı bölümüne bakın.

İş denetimi amacıyla & operatörü eklendi

&'ı bir işlem hattının sonuna eklemek, işlem hattının bir PowerShell işi olarak çalışmasına neden olur. Bir işlem hattı arka planda çalıştırıldığında, bir iş nesnesi döndürülür. İşlem hattı bir iş olarak çalıştırıldıktan sonra, işi yönetmek için tüm standart *-Job cmdlet'ler kullanılabilir. İşlem hattında kullanılan değişkenler (işleme özgü değişkenler yoksayılarak) otomatik olarak göreve kopyalanır, bu nedenle Copy-Item $foo $bar & sorunsuz çalışır. İş, kullanıcının giriş dizini yerine geçerli dizinde de çalıştırılır.

Yeni yöntemler/özellikler PSCustomObject

öğesine yeni yöntemler ve özellikler ekledik PSCustomObject. PSCustomObject şimdi diğer nesneler gibi bir Count/Length özellik içerir.

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

$PSCustomObject.Length
1
$PSCustomObject.Count
1

Bu çalışma, ForEach ve Where yöntemleri de dahil olmak üzere, PSCustomObject öğeleri üzerinde çalışmanıza ve filtrelemenize olanak tanır.

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

PSMethod'tan Temsilciye Dönüştürmeler

bir PSMethod temsilciye dönüştürebilirsiniz. Bu, PSMethod[M]::DoubleStrLen gibi değerleri temsilci olarak [M]::AggregateString'a geçirmenize olanak tanır:

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)

PowerShell 7.1'de dize karşılaştırma davranışı değiştirildi

PowerShell 7.1, .NET 5.0 üzerine kurulmuştur ve bu, aşağıdaki köklü değişikliğin ortaya çıkmasına neden olmuştur:

.NET 5.0 itibarıyla kültür sabiti dize karşılaştırmaları, yazdırılmayan denetim karakterlerini yoksayar.

Örneğin, aşağıdaki iki dize aynı olarak kabul edilir:

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

Yeni cmdlet’ler

Yeni Get-Uptime cmdlet'i

Get-Uptime cmdlet'i, işletim sisteminin son önyüklemesinin üzerinden geçen süreyi döndürür. Cmdlet, PowerShell 6.0'da kullanıma sunulmuştur.

Yeni Remove-Alias cmdlet'i

Remove-Alias cmdlet'i geçerli PowerShell oturumundan bir diğer adı kaldırır. Cmdlet, PowerShell 6.0'da kullanıma sunulmuştur.

Yeni cmdlet Remove-Service

Remove-Service cmdlet'i, kayıt defterinde ve hizmet veritabanındaki bir Windows hizmetini kaldırır. Remove-Service cmdlet'i PowerShell 6.0'da kullanıma sunulmuştur.

Yeni Markdown cmdlet'leri

Markdown, HTML biçiminde işlenebilen temel biçimlendirmeye sahip okunabilir düz metin belgeleri oluşturmaya yönelik bir standarttır.

Aşağıdaki cmdlet'ler PowerShell 6.1'e eklendi:

  • ConvertFrom-Markdown - Bir dizenin veya dosyanın içeriğini MarkdownInfo nesnesine dönüştürün.
  • Get-MarkdownOption - Konsolda Markdown içeriğini işlemek için kullanılan geçerli renkleri ve stilleri döndürür.
  • Set-MarkdownOption - Konsolda Markdown içeriğini işlemek için kullanılan renkleri ve stilleri ayarlar.
  • Markdown'i Göster - Konsolda veya HTML olarak Markdown içeriğini görüntüler

Yeni Test-Json cmdlet'i

Test-Json cmdlet'i bir dizenin geçerli bir JavaScript Nesne Gösterimi (JSON) belgesi olup olmadığını test eder ve isteğe bağlı olarak sağlanan şemada JSON belgesini doğrulayabilir.

Bu cmdlet PowerShell 6.1'de kullanıma sunulmuştur

Deneysel Özellikleri desteklemek için yeni cmdlet'ler

Deneysel Özellikleri desteklemek için PowerShell 6.2'ye aşağıdaki cmdlet'ler eklendi.

Yeni Join-String cmdlet'i

Join-String cmdlet'i, işlem hattındaki nesneleri tek bir dizede birleştirir. Bu cmdlet PowerShell 6.2'ye eklendi.

Yeni görünüm ConciseView ve cmdlet Get-Error

PowerShell 7.0, yeni bir varsayılan görünüm olan ConciseView ile etkileşimli ve betik hatalarının okunabilirliğini geliştirmek için hata iletilerinin görüntülenmesini geliştirir. Görünümler, tercih değişkeni $ErrorViewaracılığıyla kullanıcı tarafından seçilebilir.

ConciseView ile hata bir betikten veya ayrıştırıcı hatasından değilse, bu tek satırlık bir hata iletisidir:

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

Hata betik yürütme sırasında oluşuyorsa veya ayrıştırma hatasıysa, PowerShell hatayı içeren çok satırlı bir hata iletisi, bir işaretçi ve hatanın bu satırda nerede olduğunu gösteren bir hata iletisi döndürür. Terminal ANSI renk kaçış dizilerini (VT100) desteklemiyorsa renkler görüntülenmez.

PowerShell 7'deki varsayılan görünüm ConciseView'dır. Önceki varsayılan görünüm NormalView'dı ve tercih değişkenini $ErrorViewayarlayarak bunu seçebilirsiniz.

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

Uyarı

Hata iletisinin vurgu rengini değiştirmeyi desteklemek için errorAccentColor$Host.PrivateData adlı yeni bir özellik eklendi.

Yeni Get-Errorcmdlet, istendiğinde tam hatanın tam kapsamlı bir görünümünü sağlar. Varsayılan olarak cmdlet, oluşan son hatanın iç özel durumları da dahil olmak üzere tüm ayrıntılarını görüntüler.

Get-Error cmdlet'i yerleşik değişkenini $Errorkullanarak işlem hattından girişi destekler. Get-Error tüm kanallı hataları görüntüler.

$Error | Get-Error

Cmdlet, Get-Error geçerli oturumda görüntülenmesini istediğiniz hata sayısını belirtmenize olanak tanıyarak En Yeni parametresini destekler.

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

Daha fazla bilgi için bkz. Get-Error.

Cmdlet değişiklikleri

ForEach-Object paralel yürütme eklendi

PowerShell 7.0'dan başlayarak, ForEach-Object bir koleksiyondaki öğeleri yineleyen cmdlet artık yeni Parallel parametresiyle yerleşik paralelliğe sahiptir.

Varsayılan olarak, paralel betik blokları paralel görevleri başlatan çağıranın geçerli çalışma dizinini kullanır.

Bu örnek, yerel bir Windows makinesindeki 5 sistem günlüğünden 50.000 günlük girdisi alır:

$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

Parallel parametresi, her giriş günlüğü adı için paralel olarak çalıştırılacak betik bloğunu belirtir.

Yeni ThrottleLimit parametresi, belirli bir zamanda paralel çalışan betik bloklarının sayısını sınırlar. Varsayılan değer 5'tir.

$_ Betik bloğundaki geçerli giriş nesnesini temsil etmek için değişkenini kullanın. Çalışan betik bloğuna değişken başvurularını iletmek için Using: kapsam değiştiricisini kullanın.

Daha fazla bilgi için bkz. ForEach-Object.

Windows'da uyumlu yerleşik modülleri denetleme system32

Windows 10 1809 güncelleştirmesi ve Windows Server 2019'da, bir dizi yerleşik PowerShell modülünü PowerShell ile uyumlu olarak işaretlenecek şekilde güncelleştirdik.

PowerShell başlatıldığında, ortam değişkeninin PSModulePath bir parçası olarak otomatik olarak içerir$windir\System32. Ancak CompatiblePSEdition öğesi, Core ile uyumlu olarak işaretlenmişse modülleri Get-Module ve Import-Module'e kullanıma sunar.

Switch parametresini kullanarak -SkipEditionCheck tüm modülleri göstermek için bu davranışı geçersiz kılabilirsiniz. Ayrıca tablo çıkışına bir PSEdition özellik ekledik.

-lp tüm -LiteralPath parametreler için diğer ad

tüm yerleşik PowerShell cmdlet'leri için -LiteralPath parametresi olan standart bir -lp parametre diğer adı oluşturduk.

Gerçekten mevcut değilse a*b, hata döndürmek için Get-Item -LiteralPath a*b düzelt.

Daha önce, -LiteralPath verilen bir joker karakter, -Path ile aynı şekilde işlenecek ve joker karakter hiçbir dosya bulamazsa sessizce çıkacaktı. Doğru davranış, -LiteralPath'nin literal değer olması gerektiğidir, bu nedenle dosya yoksa hata vermelidir. Değişiklik, -Literal ile kullanılan joker karakterleri sabit değer olarak işlemektir.

geçerli dizini çalışma dizini olarak ayarla Start-Job

Start-Job Cmdlet artık yeni iş için çalışma dizini olarak geçerli dizini kullanıyor.

*-Computer cmdlet'lerinden -Protocol kaldır

CoreFX'teki RPC (özellikle Windows dışı platformlarda) uzaktan iletişim ve PowerShell'de tutarlı bir uzaktan iletişim deneyimi sağlama ile ilgili sorunlar nedeniyle, -Protocol parametresi \*-Computer cmdlet'lerinden kaldırıldı. DCOM artık uzaktan bağlantı için desteklenmiyor. Aşağıdaki cmdlet'ler yalnızca WSMAN uzaktan yönetimini destekler.

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

-ComputerName öğesini *-Service cmdlet'lerinden kaldırın

PSRP'nin -ComputerName tutarlı kullanımını teşvik etmek için parametresi cmdlet'lerden *-Service kaldırıldı.

Get-Content -Delimiter'yi döndürülen satırlara sınırlayıcı eklenmeyecek şekilde düzeltin.

Daha önce kullanırken elde edilen çıkış Get-Content -Delimiter tutarsızdı ve sınırlayıcıyı kaldırmak için verilerin daha fazla işlenmesini gerektirdiğinden uygunsuzdu. Bu değişiklik, döndürülen satırlardaki sınırlayıcıyı kaldırır.

Değişiklikler: Format-Hex

-Raw parametresi artık bir "no-op" (hiçbir şey yapmaz). Bundan sonra, tüm çıktı, türüne ait tüm baytları içeren sayıların doğru bir temsilini gösterecektir. -Raw değişiklik öncesinde parametre bunu yapıyordu.

Get-ComputerInfo özellik adında yazım hatası düzeltmesi

BiosSerialNumber yanlış olarak BiosSeralNumber biçiminde yazılmış ve doğru yazımıyla değiştirilmiştir.

Get-StringHash ve Get-FileHash cmdlet'lerini ekle

Bu değişiklik, bazı karma algoritmaların CoreFX tarafından desteklenmemesi ve bu nedenle artık kullanılamamasıdır:

  • MACTripleDES
  • RIPEMD160

$c0 içerisindeki cmdlet'lere, $null geçirmenin hata yerine tüm nesneleri döndürdüğü durumlarda, doğrulama ekleyin

$null Aşağıdakilerden herhangi birine geçiş yapmak şimdi bir hata oluşturur:

  • 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

Import-Csv içinde W3C Genişletilmiş Günlük Dosyası Biçimi için destek ekleyin

Import-Csv Daha önce, cmdlet W3C genişletilmiş günlük biçiminde günlük dosyalarını doğrudan içeri aktarmak için kullanılamayacaktı ve ek eylem gerekli olacaktı. Bu değişiklikle, W3C genişletilmiş günlük biçimi desteklenmektedir.

Import-Csv, CSV'de tür bilgileri mevcut olduğunda içeri aktarma sırasında pstypenames uygular

Daha önce, Export-Csv ile dışa aktarılan ve TypeInformation içe aktarılan nesneler ConvertFrom-Csv kullanıldığında tür bilgilerini tutmuyordu. Bu değişiklik, CSV dosyasından kullanılabiliyorsa pstypenames üyeye tür bilgisini ekler.

-NoTypeInformation varsayılan ayardır Export-Csv

Export-Csv Daha önce, cmdlet nesnenin tür adını içeren ilk satır olarak bir açıklama çıkışı verecekti. Çoğu CSV aracı tarafından anlaşılmadığından, değişiklik tür bilgilerini varsayılan olarak dışlar. Bu değişiklik, müşteri geri bildirimlerini ele almak için yapılmıştır.

Önceki davranışı korumak için kullanın -IncludeTypeInformation .

*’ın Remove-Item için kayıt defteri yolunda kullanılmasına izin ver

Daha önce joker karakter -LiteralPath, -Path ile aynı şekilde ele alınırdı ve eğer joker karakter hiçbir dosya bulamazsa sessizce işlem sonlandırılırdı. Doğru davranış, -LiteralPath'nin tam olarak belirtilmiş bir değer olarak kabul edilmesi olmalıdır, bu nedenle dosya yoksa hata vermelidir. Joker karakterlerin -Literal ile kullanıldığında metin olarak işlenmesi gerekir.

Group-Object şimdi grupları sıralar

Performans geliştirmesinin bir parçası olarak, Group-Object şimdi grupların sıralanmış bir listesini döndürür. Her ne kadar sıralamaya güvenmemeniz gerekse de, ilk grubu istiyorsanız bu değişiklik sizi etkileyebilir. Önceki davranışa bağımlı olmanın etkisi düşük olduğundan bu performans iyileştirmesinin değer olduğuna karar verdik.

standart sapma Measure-Object

Measure-Object çıktısı artık bir StandardDeviation özelliği içeriyor.

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 şimdi Password parametresi vardır, bu da bir SecureString alır. Bu, etkileşimli olmayan bir şekilde kullanmanıza olanak tanır:

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

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

İşlevin more kaldırılması

Geçmişte PowerShell, Windows üzerinde more.com sarmalayan more adlı bir işlev içeriyordu. Bu işlev artık kaldırıldı.

Ayrıca işlev, Windows'ta more.com veya Windows dışı platformlarda $Env:PAGER tarafından belirtilen sistemin varsayılan sayfalayıcısında kullanılacak şekilde değiştirildi.

cd DriveName: şimdi kullanıcıları bu sürücüdeki geçerli çalışma dizinine döndürür

Önceden, Set-Location veya cd kullanarak bir PSDrive'a dönmek, kullanıcıları o sürücünün varsayılan konumuna gönderiyordu. Kullanıcılar artık bu oturum için bilinen son geçerli çalışma dizinine gönderilir.

cd - önceki dizine döner

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

Veya Linux'ta:

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

Ayrıca, cd ve cd --, $HOME olarak değişir.

Update-Help yönetici yetkisi olmadan

Popüler talep üzerine, Update-Help artık yönetici olarak çalıştırılması gerekmez. Update-Help şimdi varsayılan olarak yardım dosyalarını kullanıcıya yönelik bir klasöre kaydeder.

Where-Object -Not

-Not parametresinin Where-Object'e eklenmesiyle, bir özelliğin mevcut olmadığını veya özelliğin null/boş değer taşıdığını kontrol ederek işlem hattındaki bir nesneyi filtreleyebilirsiniz.

Örneğin, bu komut tanımlı bağımlı hizmetleri olmayan tüm hizmetleri döndürür:

Get-Service | Where-Object -Not DependentServices

Web Cmdlet'lerindeki değişiklikler

Web Cmdlet'lerinin altında yatan .NET API'si System.Net.Http.HttpClient olarak değiştirildi. Bu değişiklik birçok avantaj sağlar. Ancak, bu değişiklik ve Internet Explorer ile birlikte çalışabilirlik eksikliği nedeniyle, Invoke-WebRequest ve Invoke-RestMethod içinde birkaç önemli değişikliğe yol açtı.

  • Invoke-WebRequest artık yalnızca temel HTML Ayrıştırma'sını destekliyor. Invoke-WebRequest her zaman bir BasicHtmlWebResponseObject nesne döndürür. ParsedHtml ve Forms özellikleri kaldırıldı.
  • BasicHtmlWebResponseObject.Headers değerleri artık String[] yerine Stringkullanılır.
  • BasicHtmlWebResponseObject.BaseResponse artık bir System.Net.Http.HttpResponseMessage nesnedir.
  • Web Cmdlet özel durumlarındaki Response özelliği artık bir System.Net.Http.HttpResponseMessage nesnedir.
  • RFC üst bilgisi katı ayrıştırma, artık -Headers ve -UserAgent parametreleri için varsayılandır. Bu -SkipHeaderValidation ile atlanabilir.
  • file:// ve ftp:// URI düzenleri artık desteklenmiyor.
  • System.Net.ServicePointManager ayarları artık kabul edilmez.
  • Şu anda macOS'ta sertifika tabanlı kimlik doğrulaması yoktur.
  • Bir URI'nin -Credential üzerinde http:// kullanılması hataya neden olur. Hatayı engellemek için bir https:// URI kullanın veya parametresini sağlayın -AllowUnencryptedAuthentication .
  • -MaximumRedirection artık yeniden yönlendirme girişimleri son yeniden yönlendirmenin sonuçlarını döndürmek yerine sağlanan sınırı aştığında sonlandırıcı bir hata üretir.
  • PowerShell 6.2'de JSON yanıtları için UTF-8 kodlamasında varsayılan olarak bir değişiklik yapıldı. JSON yanıtı için bir karakter kümesi sağlanmadığında, varsayılan kodlama RFC 8259 başına UTF-8 olmalıdır.
  • Yanıtlar için application-json varsayılan kodlama UTF-8 olarak ayarlandı
  • Standartlara uygun olmayan üst bilgilere izin vermek Content-Type için parametresi eklendi -SkipHeaderValidation
  • Basitleştirilmiş multipart/form-data desteği desteklemek için parametre eklendi -Form
  • İlişki anahtarlarının uyumlu, büyük/küçük harfe duyarlı olmayan işlenmesi
  • Web cmdlet'leri için parametre eklendi -Resume

Invoke-RestMethod, veri döndürülmezse yararlı bilgiler döndürür

Bir API yalnızca null döndürdüğünde, Invoke-RestMethod bunu $null yerine "null" olarak serileştiriyordu. Bu değişiklik, geçerli bir tek değerli JSON null değişmez değerini olarak $nulldüzgün bir şekilde seri hale getirmek için içindeki Invoke-RestMethod mantığı düzeltir.

Web Cmdlet'leri şifrelenmemiş bağlantılar üzerinden gönderildiğinde -Credential uyarır

HTTP kullanılırken, parolalar dahil içerik düz metin olarak gönderilir. Bu değişiklik, varsayılan olarak buna izin vermemek ve kimlik bilgileri güvenli olmayan bir şekilde geçiriliyorsa hata döndürmektir. Kullanıcılar bunu -AllowUnencryptedAuthentication anahtarını kullanarak atlayabilir.

Gibi çalışacak web cmdlet'lerinde parametre yapma -OutFile-LiteralPath

PowerShell 7.1'de başlayarak, web cmdlet'lerinin OutFile parametresi LiteralPath gibi çalışır ve joker karakterleri işlemez.

API değişiklikleri

Sınıfı kaldır AddTypeCommandBase

AddTypeCommandBase sınıfı, performansı artırmak için Add-Type öğesinden kaldırıldı. Bu sınıf yalnızca Add-Type cmdlet tarafından kullanılır ve kullanıcıları etkilememesi gerekir.

Add-Type'de desteklenen dil olarak kaldırıldı VisualBasic

Geçmişte, cmdlet'ini Add-Type kullanarak Visual Basic kodunu derleyebilirsiniz. Visual Basic ile Add-Type nadiren kullanıldı. PowerShell'in boyutunu küçültmek için bu özelliği kaldırdık.

Destek kaldırıldı RunspaceConfiguration

Daha önce API'yi kullanarak program aracılığıyla bir PowerShell runspace oluştururken eski RunspaceConfiguration veya daha InitialSessionState yeni sınıfları kullanabilirsiniz. Bu değişiklik, RunspaceConfiguration desteğini kaldırdı ve yalnızca InitialSessionState'i destekler hale getirdi.

CommandInvocationIntrinsics.InvokeScriptyerine bağımsız değişkenleri bağlama $input$args

Parametrenin yanlış konumu, arg'lerin args olarak değil, giriş olarak değerlendirilmesine neden oldu.

ve BuildVersion özelliklerini kaldırma ClrVersion$PSVersionTable

ClrVersion özelliği $PSVersionTable CoreCLR ile kullanışlı değildir. Son kullanıcılar uyumluluğu belirlemek için bu değeri kullanmamalıdır.

BuildVersion Özelliği, Windows olmayan platformlarda bulunmayan Windows derleme sürümüne bağlıydı. PowerShell'in GitCommitId tam derleme sürümünü almak için özelliğini kullanın.

Unicode kaçış ayrıştırmayı uygula

`u#### veya `u{####} ilgili Unicode karakterine dönüştürülür. Sabit `udeğer çıkarmak için, arka çıtadan çıkış: ``u.

PS işlevlerinde parametre ValueFromRemainingArguments bağlama sorunu

ValueFromRemainingArguments şimdi değerleri, kendisi bir dizi olan tek bir değer yerine dizi olarak döndürür.

CommandTypes.Workflow ve WorkflowInfoCleaned kullanımları temizlendi

System.Management.Automation içindeki ve WorkflowInfo kullanımları CommandTypes.Workflow ile ilgili kodu temizleyin.

Bu küçük yıkıcı değişiklikler esas olarak yardım sağlayıcı kodunu etkiler.

  • öğesinin ortak oluşturucularını WorkflowInfo iç olarak değiştirin. artık iş akışını desteklemiyoruz, bu nedenle kişilerin örnek oluşturmasına Workflow izin vermemek mantıklıdır.
  • Yalnızca iş akışı hata ayıklaması için kullanıldığından System.Management.Automation.DebugSource türünü kaldırın.
  • SetParent öğesinin yalnızca iş akışı hata ayıklaması için kullanılan Debugger soyut sınıfındaki aşırı yüklemesini kaldırın.
  • Türetilmiş RemotingJobDebugger sınıfından aynı aşırı yüklemesini SetParent kaldırın.

Bir ScriptBlock öğesini bir temsilciye dönüştürürken, dönüş sonucunu PSObject içinde sarmamaya dikkat edin.

C ScriptBlock # bağlamında kullanılacak bir temsilci türüne dönüştürüldüğünde, sonucun bir PSObject içinde sarmalanması gereksiz sorunlar getirir:

  • Değer temsilci dönüş türüne dönüştürüldüğünde, PSObject temelde çözülür. PSObject Bu yüzden gereksiz.
  • Temsilci dönüş türü olduğunda object, C# kodunda çalışmayı zorlaştıran bir PSObject içine sarmalanır.

Bu değişiklik sonrasında, döndürülen nesne temel alınan nesnedir.

Uzaktan İletişim Desteği

Unix platformlarında WinRM kullanan PowerShell Uzaktan İletişimi (PSRP), HTTPS üzerinden NTLM/Negotiate veya Temel Kimlik Doğrulaması gerektirir. macOS'ta PSRP yalnızca HTTPS üzerinden Temel Kimlik Doğrulamayı destekler. Windows dışı platformlarda Kerberos tabanlı kimlik doğrulaması desteklenmez.

PowerShell ayrıca tüm platformlarda (Windows, macOS ve Linux) SSH üzerinden PowerShell Uzaktan İletişimi'yi (PSRP) destekler. Daha fazla bilgi için bkz. PowerShell'de SSH uzaktan iletişim .

Kapsayıcılar için PowerShell Direct, öncelikli olarak pwsh kullanmayı dener

PowerShell Direct , ağ bağlantısı veya diğer uzaktan yönetim hizmetleri olmadan Hyper-V bir VM'ye veya Kapsayıcıya bağlanmanızı sağlayan bir PowerShell ve Hyper-V özelliğidir.

Geçmişte PowerShell Direct, Kapsayıcıdaki yerleşik Windows PowerShell örneğini kullanarak bağlanmıştı. Şimdi, PowerShell Direct ilk olarak ortam değişkeninde kullanılabilir pwsh.exe herhangi birini kullanarak bağlanmayı PATH dener. pwsh.exe kullanılamıyorsa, PowerShell Direct, powershell.exe kullanmaya geri döner.

Enable-PSRemoting şimdi önizleme sürümleri için ayrı uzaktan iletişim uç noktaları oluşturur

Enable-PSRemoting şimdi iki uzaktan iletişim oturumu yapılandırması oluşturur:

  • PowerShell'in ana sürümü için bir tane. Örneğin, PowerShell.6. Bu uç nokta, "Sistem genelinde" PowerShell 6 oturum yapılandırması olarak, küçük sürüm güncellemeleri sırasında güvenilebilecek bir yapı sağlar.
  • Sürüme özgü bir oturum yapılandırması, örneğin: PowerShell.6.1.0

Aynı makinede birden çok PowerShell 6 sürümünün yüklü ve erişilebilir olmasını istiyorsanız bu davranış yararlıdır.

Ayrıca, PowerShell'in önizleme sürümleri artık Enable-PSRemoting cmdlet'ini çalıştırdıktan sonra kendi uzaktan oturum yapılandırmalarına sahip olur:

C:\WINDOWS\system32> Enable-PSRemoting

Daha önce WinRM'i ayarlamadıysanız çıkışınız farklı olabilir.

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

Ardından, PowerShell 6'nın önizlemesi ve kararlı derlemeleri ve belirli her sürüm için ayrı PowerShell oturum yapılandırmaları görebilirsiniz.

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 SSH için desteklenen söz dizimi

SSH istemcileri genellikle biçiminde user@host:portbir bağlantı dizesini destekler. PowerShell Uzaktan İletişimi için bir protokol olarak SSH'nin eklenmesiyle, bu bağlantı dizesi biçimi için destek ekledik:

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

Telemetri yalnızca bir ortam değişkeniyle devre dışı bırakılabilir

PowerShell, başlatıldığında temel telemetri verilerini Microsoft'a gönderir. Veriler işletim sistemi adını, işletim sistemi sürümünü ve PowerShell sürümünü içerir. Bu veriler, PowerShell'in kullanıldığı ortamları daha iyi anlamamıza olanak tanır ve yeni özellik ve düzeltmelere öncelik vermemizi sağlar.

Bu telemetriyi geri çevirmek için POWERSHELL_TELEMETRY_OPTOUT ortam değişkenini true, yesveya 1olarak ayarlayın. Telemetriyi devre dışı bırakmak için dosyanın DELETE_ME_TO_DISABLE_CONSOLEHOST_TELEMETRY silinmesini artık desteklemiyoruz.