michi.wtr
Goto Top

PowerShell 7 nicht kompatibel mit PowerShell 5 ?

Hi zusammen,

mir wurde neulich dringend empfohlen, meine PowerShell 5 auf PowerShell 7.3.4 zu upgraden. Leider habe ich da aber einige Probleme, bei denen ich nicht weiß, ob ich sie haben sollte....

Zuerst wollte ich mir ein neues Profil für PowerShell 7 einrichten. Als ich aber versucht habe, dieses mit der ISE zu öffnen, hatte ich schon einige Probleme. Als das Profil für PowerShell 5 beim Start der ISE ausgeführt wurde, bekam ich einen Haufen Errors geliefert, da ich in meinem $profile.AllUsersAllHosts die Farben für die PowerShell geändert habe. Nur leider waren die Cmdlets zum ändern der Farbe der ISE wohl nicht mehr bekannt. Da mir die Farben aber auch nicht so wichtig sind, habe ich diese im Profil auskommentiert.

Trotzdem bekomme ich, auch wenn ich ISE ohne Profil ausführe einen Error für ipmo: Das Modul "ISE" konnte nicht gefunden werden....
Deshalb habe ich probiert, in der PowerShell (Version 7.3.4) mir die Module für PowerShell (Version 5.1.2) anzeigen zu lassen:

powershell "& {Get-Module -ListAvailable}"  

Leider bekomme ich hier keinen Output zurück. Führe ich denselben Befehl mit PowerShell Version 5 aus, dann erhalte ich aber alle Module, ebenso wenn ich den Befehl in der Kommandozeile (cmd) ausführe.

Wenn ich mir dann $env:PSModulePath anzeigen lasse:

powershell "& {$env:PSModulePath}"  

Dieser Befehl gibt mir leider nur ein Semikolon zurück, ergo es gibt wohl keine Modul Pfade... Führe ich diesen Befehl mit PowerShell Version 5 oder der Kommandozeile (cmd) aus, erhalte ich aber wie gewohnt meine Pfade...

screenshot 2023-04-16 033311


Ich kann mir nicht vorstellen, dass dies so gewollt ist und ich mit PowerShell 7 keine ISE mehr anständig öffnen kann bzw. keine Befehle für PowerShell Version 5 mehr ausführen kann. Gibt es irgendeine Möglichkeit, dieses Problem zu beheben?
Außerdem kommen mir diese doppelten Semikolons vom $env:PSModulePath in PowerShell 7 sehr komisch vor (siehe Bild)


Hatte schon jemand ähnliche Probleme?

PS: Als ich auf powershell.org nachgeforscht habe, sind mir noch einige Themen mehr aufgefallen, die leider nicht gelöst waren. Jedoch habe ich dieselben "Probleme". Get-Service gibt mir nun keine [System.Service.ServiceController] mehr zurück, sondern [System.Service.ServiceController#StartupType]. Ist das etwa so gewollt? Dieser Typ kommt mir auch etwas komisch vor, da ich sonst noch nie ein Objekt mit einem # gesehen hatte....

Content-Key: 6788315873

Url: https://administrator.de/contentid/6788315873

Printed on: April 27, 2024 at 19:04 o'clock

Mitglied: 6247018886
Solution 6247018886 Apr 16, 2023 updated at 06:35:08 (UTC)
Goto Top
Zitat von @michi.wtr:

Hi zusammen,

mir wurde neulich dringend empfohlen, meine PowerShell 5 auf PowerShell 7.3.4 zu upgraden.
Aha, und warum "dringend"?

Erst einmal ist der Umstieg von PS5 auf PS 7 ist in dem Sinne kein Upgrade und auch keine Einbahnstraße, denn PS7 hat einen eigenen Interpreter namens pwsh und der wird nur parallel zur bisherigen weiterhin verfügbaren PS5 installiert! PS7 ist also eine Option kein muss.
Man kann seinen Code also entweder mit dem Interpreter von Version 5 (powershell) oder in einer Version 7 Konsole (pwsh) laufen lassen, it's your choice.

Deshalb habe ich probiert, in der PowerShell (Version 7.3.4) mir die Module für PowerShell (Version 5.1.2) anzeigen zu lassen:

powershell "& {Get-Module -ListAvailable}"  

Leider bekomme ich hier keinen Output zurück.
Normal im Standardzustand.

RTFM hier steht's ...
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
Wenn ich mir dann $env:PSModulePath anzeigen lasse:

powershell "& {$env:PSModulePath}"  

Dieser Befehl gibt mir leider nur ein Semikolon zurück, ergo es gibt wohl keine Modul Pfade... Führe ich diesen Befehl mit PowerShell Version 5 oder der Kommandozeile (cmd) aus, erhalte ich aber wie gewohnt meine Pfade...

screenshot 2023-04-16 033311


Ich kann mir nicht vorstellen, dass dies so gewollt ist und ich mit PowerShell 7 keine ISE mehr anständig öffnen kann bzw. keine Befehle für PowerShell Version 5 mehr ausführen kann.

RTFM hier steht's ...
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...

Klar sein sollte auch das PS5 Befehle nicht mehr alle zwingend in einer PS7 Konsole laufen, brauchst du also Zugriff auf diese erzeuge eine PS5 Session. PS7 hat seine eigene Umgebung, auch deswegen weil Module PS7 kompatibel sein müssen werden bereits vorhandene aus PS5 dort nicht geladen.


Gibt es irgendeine Möglichkeit, dieses Problem zu beheben?
Es ist kein Problem du musst nur das Manual lesen 😀.
Differences between Windows PowerShell 5.1 and PowerShell 7.x

Und tada, da liest du dann :
Modules no longer shipped with PowerShell
For various compatibility reasons, the following modules are no longer included in PowerShell.

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

Improved backwards compatibility with Windows PowerShell
For Windows, a new switch parameter UseWindowsPowerShell is added to Import-Module. This switch creates a proxy module in PowerShell 7 that uses a local Windows PowerShell process to implicitly run any cmdlets contained in that module. For more information, see Import-Module.

For more information on which Microsoft modules work with PowerShell 7.0, see the Module Compatibility Table.
Neue Dinge muss man halt immer wieder lernen ...


Cheers Briggs.
Member: mayho33
mayho33 Apr 16, 2023 at 12:19:06 (UTC)
Goto Top
Zitat von @michi.wtr:

Hi zusammen,
Hi

mir wurde neulich dringend empfohlen, meine PowerShell 5 auf PowerShell 7.3.4 zu upgraden. Leider habe ich da aber einige Probleme, bei denen ich nicht weiß, ob ich sie haben sollte....
Ergänzend zu der ausführlichen Erklärung von @6247018886 wäre noch zu sagen, dass sich ein PS7-Script nicht portieren lässt ohne PS7 am Ziel zu installieren.

So toll ist es dann auch wieder nicht, dass man sich den Nagel eintreten will...
Member: michi.wtr
michi.wtr Apr 17, 2023 at 11:15:18 (UTC)
Goto Top
Quote from @mayho33:

Ergänzend zu der ausführlichen Erklärung von @6247018886 wäre noch zu sagen, dass sich ein PS7-Script nicht portieren lässt ohne PS7 am Ziel zu installieren.

So toll ist es dann auch wieder nicht, dass man sich den Nagel eintreten will...

Naja, das ich PS7 auf allen Geräten installieren müsste, auf denen die Skripts laufen usw. war mir schon klar. Nur dass es mit PS7 so schwer ist mit Version 5 zu arbeiten, das hat mich leicht gewundert. Tatsächlich bin ich eher leicht genervt davon beides parallel im Einsatz zu haben und würde entweder alle Clients auf PS7 umstellen oder keinen....

Was ich ganz nett fand, wir haben einige Aufgaben, welche ich in Skripte schreiben möchte, die große Datenmengen bearbeiten müssten. Dafür wäre das feature -Parallel für Foreach-Object ganz nett gewesen.
Mitglied: 6247018886
6247018886 Apr 17, 2023 updated at 12:07:49 (UTC)
Goto Top
Zitat von @michi.wtr:
Nur dass es mit PS7 so schwer ist mit Version 5 zu arbeiten, das hat mich leicht gewundert.
Einfach mit der Version laufen lassen für welche du die Skripte getestet hast!
Tatsächlich bin ich eher leicht genervt davon beides parallel im Einsatz zu haben und würde entweder alle Clients auf PS7 umstellen oder keinen....
Man hat doch die Wahl, entweder powershell oder pwsh, ich sehe da keinen Nachteil. Bis man alle Skripte auf die Eigenheiten der Version 7 umgestellt hat einfach mit dem "powershell"-Interpreter laufen lassen.

Was ich ganz nett fand, wir haben einige Aufgaben, welche ich in Skripte schreiben möchte, die große Datenmengen bearbeiten müssten. Dafür wäre das feature -Parallel für Foreach-Object ganz nett gewesen.
Das geht auch mit Powershell 5 wenn man die runspaces selbst anlegt face-wink.
Member: michi.wtr
michi.wtr Apr 17, 2023 at 12:35:26 (UTC)
Goto Top
Zitat von @6247018886:

Das geht auch mit Powershell 5 wenn man die runspaces selbst anlegt face-wink.

Damit kenne ich mich noch gar nicht aus, werde ich mir aber mal ansehen ^^
Member: mayho33
mayho33 Apr 18, 2023 at 12:55:18 (UTC)
Goto Top
Zitat von @michi.wtr:

Quote from @mayho33:

Ergänzend zu der ausführlichen Erklärung von @6247018886 wäre noch zu sagen, dass sich ein PS7-Script nicht portieren lässt ohne PS7 am Ziel zu installieren.

So toll ist es dann auch wieder nicht, dass man sich den Nagel eintreten will...

Naja, das ich PS7 auf allen Geräten installieren müsste, auf denen die Skripts laufen usw. war mir schon klar. Nur dass es mit PS7 so schwer ist mit Version 5 zu arbeiten, das hat mich leicht gewundert. Tatsächlich bin ich eher leicht genervt davon beides parallel im Einsatz zu haben und würde entweder alle Clients auf PS7 umstellen oder keinen....

Was ich ganz nett fand, wir haben einige Aufgaben, welche ich in Skripte schreiben möchte, die große Datenmengen bearbeiten müssten. Dafür wäre das feature -Parallel für Foreach-Object ganz nett gewesen.

So stehts ja auch in den Release Notes. Ganz kurz: [...] nicht abwärts kompatibel...
Member: Penny.Cilin
Penny.Cilin May 01, 2023 at 09:21:47 (UTC)
Goto Top
Moin,

ich habe im Internet folgendes Skript gefunden, mit welchem man in der ISE PowerShell 7 nutzen können soll. beziehungsweise man kann in der ISE zwischen PowerShell 5 und PowerShell 7 switchen.

Ungetestet:
$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Clear()
$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Add("Switch to PowerShell 7", {   
        function New-OutOfProcRunspace {
            param($ProcessId)

            $ci = New-Object -TypeName System.Management.Automation.Runspaces.NamedPipeConnectionInfo -ArgumentList @($ProcessId)
            $tt = [System.Management.Automation.Runspaces.TypeTable]::LoadDefaultTypeFiles()

            $Runspace = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace($ci, $Host, $tt)

            $Runspace.Open()
            $Runspace
        }

        $PowerShell = Start-Process PWSH -ArgumentList @("-NoExit") -PassThru -WindowStyle Hidden  
        $Runspace = New-OutOfProcRunspace -ProcessId $PowerShell.Id
        $Host.PushRunspace($Runspace)
}, "ALT+F5") | Out-Null  

$psISE.CurrentPowerShellTab.AddOnsMenu.Submenus.Add("Switch to Windows PowerShell", {   
    $Host.PopRunspace()

    $Child = Get-CimInstance -ClassName win32_process | where {$_.ParentProcessId -eq $Pid}
    $Child | ForEach-Object { Stop-Process -Id $_.ProcessId }

}, "ALT+F6") | Out-Null  

Über den Sinn oder Unsinn kann man streiten.

Gruss Penny.