Cập nhật khả năng tương thích Windows của PowerShell Core
Tôi nghĩ mình nên chia sẻ thông tin cập nhật nhanh về trải nghiệm của mình khi sống trong thế giới PowerShell Core. Một trong những điều mà Microsoft đang nỗ lực để làm cho việc này trở nên dễ dàng hơn là cách truy cập các mô-đun Windows PowerShell sẽ hoạt động trong PowerShell Core. Nó thực hiện điều này thông qua các lệnh trong mô-đun WindowsCompatibility. Tuy nhiên, tôi đã gặp phải một điều khó chịu mà bạn cũng có thể thấy mà tôi nghĩ mình nên chia sẻ, cùng với công việc xung quanh của tôi.
Hành vi dự kiến
PowerShell Core hoạt động khá giống với Windows PowerShell. Trong hệ thống Windows, bạn có thể ánh xạ một PSDrive mới và nếu bạn sử dụng một chữ cái, PowerShell sẽ tự động xác định một chức năng đơn giản giúp bạn dễ dàng thay đổi sang đường dẫn đó.
Tôi có thể tạo PSDrive mới và thay đổi nó mà không gặp lỗi. Bây giờ tôi sẽ nhập mô-đun WindowsCompatibility.
Hành vi vấn đề
Một trong những cách hoạt động của mô-đun này là cung cấp quyền truy cập vào các lệnh Windows PowerShell thông qua phiên tương thích từ xa. Có thể không phải lúc nào cũng rõ ràng khi nào một phiên như vậy được tạo, mặc dù bạn có thể cố ý tạo nó bằng Khởi tạo-WinSession.
Tôi chắc chắn rằng kỳ vọng là các lệnh sẽ sử dụng phiên này một cách minh bạch. Nhưng có một chút vấn đề. Hãy xem điều gì xảy ra khi tôi cố gắng chuyển sang ổ S: bây giờ.
PowerShell phàn nàn nhưng thực tế lại thay đổi vị trí. Đi sâu vào lỗi tôi thấy lệnh Set-Location đang được chạy qua phiên WinCompatibility, phiên này không biết gì về ổ S:.
Tôi phát hiện ra rằng nếu tôi tạo ổ đĩa trong phiên thì lỗi khó chịu sẽ được giải quyết.
Một giải pháp theo kịch bản
Với suy nghĩ này, tôi đã nghĩ ra một giải pháp theo kịch bản. Một phần hồ sơ PowerShell của tôi là tạo một số phím tắt PSDrive. Khi những điều đó đã được xác định, tôi sẽ tiếp tục nhập WindowsCompatibilityModule
Import-Module WindowsCompatibility
Add-WindowsPSModulePath
Initialize-WinSession
Tôi biết tôi sẽ cần phiên WinCompat. Sau đó tôi gọi chức năng này.
#requires -version 6.1
#requires -module WindowsCompatibility
Function Update-WinCompatibiltySession {
[cmdletbinding(SupportsShouldProcess)]
[alias("uwc")]
Param([switch]$Passthru)
Try {
$s = Get-PSSession -name "wincompat-localhost-$env:username" -ErrorAction Stop
$local = Get-PSDrive
foreach ($psdrive in $local) {
if ($PSCmdlet.ShouldProcess($pdrive.name, "Adding")) {
Invoke-Command {
Try {
Get-PSDrive -Name $using:psdrive.name -ErrorAction Stop | Out-Null
}
Catch {
$newParams = @{
name = $using:psdrive.name
PSProvider = $using:psdrive.provider
Root = $using:psdrive.root
}
#mapping the drive using the credential. This may not be necessary.
if ($using:psdrive.credential.username) {
$newParams.Add("Credential", $using:psdrive.credential)
}
$new = New-PSDrive @newParams
if ($using:Passthru) {
$new
}
}
} -session $s
}
} #Whatif
}
Catch {
Write-Warning "Did not detect a WinCompat remoting session. You might need to run Initialize-WinSession."
}
}
Hàm này lấy tất cả PSDrive trong phiên cục bộ của tôi và thêm nó vào phiên từ xa nếu nó chưa tồn tại. Và vâng, tôi nhận ra rằng có một số cách để tôi có thể đạt được điều này. Nhưng bây giờ, lỗi của tôi đã biến mất.
Nếu sau này tôi thêm ổ đĩa khác, tôi cần chạy lại chức năng.
Tôi có một vấn đề mở về vấn đề này trong GitHub nhưng hiện tại, sự sắp xếp này dường như đã giải quyết được vấn đề.