Dela det här inlägget:
En PowerShell-profil är ett skript som körs när PowerShell startar och som har ett visst namn.
PowerShell har stöd för flera profiler för användare och värdprogram. När vi säger värdprogram tänker vi främst på Windows PowerShell Console och Windows PowerShell ISE. Det skapar dock inte profilerna åt dig så fortsätt att läsa den här artikeln så ska jag visa dig hur du skapar och anpassar profiler med häftiga exempel.
Vi kan skapa 3 profilfiler för varje användare i systemet, en för varje värddator (Windows PowerShell Console och ISE) och en för alla värddatorer.
Det är dessutom möjligt att skapa 3 profilfiler för alla användare om vi vill tillämpa någon anpassning som gäller för alla användare.
VIKTIGT: Om du har en separat installation av PowerShell version 6 så kan vi skapa ytterligare 4 profiler. Två profilfiler per användare och två profilfiler för alla användare.
Innehållsförteckning
PowerShell-profilkommandon, värdar, profilnamn, profilplatser
Här finns en tabell som visar profiltyper, kommando som kan användas för att testa om en profil existerar och skapa dem om vi vill, vilken värd den här profilen gäller för, profilfilens namn och profilfilens plats.
# | Profiltyp | Kommando | Host | Namn på profilfilen | Profilfilfilens plats |
---|---|---|---|---|---|
1* | Aktuell användare, Current Host | $profile | Console | Microsoft.PowerShell_profile.ps1 | $HOME\ Documents\WindowsPowerShell\ |
2 | Alla användare, aktuell värddator | $profile.AllUsersCurrentHost | Console | Microsoft.PowerShell_profile.ps1 | $PSHOME\ |
3 | Aktuell användare, alla värdar | $profile.CurrentUserAllHosts | Konsol, ISE | Profil.ps1 | $HOME\ Documents\WindowsPowerShell\ |
4 | Alla användare, alla värdar | $profile.AllUsersAllHosts | Konsol, ISE | Profile.ps1 | $PSHOME\ |
5** | Aktuell användare, aktuell värddator | $profile | ISE | Microsoft.PowerShellISE_profile.ps1 | $HOME\ Documents\WindowsPowerShell\ |
6** | Alla användare, Current Host | $profile.AllUsersCurrentHost | ISE | Microsoft.PowerShellISE_profile.ps1 | $PSHOME\ |
Tabell 1 – PowerShell-profiltyper, kommandon, värdar, filnamn, filställen
* Istället för $profile kan vi använda $profile.CurrentUserCurrentHost kommandot.
** Kör kommandot från Windows PowerShell ISE-konsolen.
För att hitta rätt värden för variablerna $HOME och $PSHOME i din PowerShell-installation kan du köra följande kommandon:
$HOME
Värdet för $HOME är vanligtvis C:\Users\user_name
$PSHOME
Villkoret för $PSHOME är normalt C:\Windows\System32\WindowsPowerShell\v1.0
HEMMAS: Om du har en separat installation av PowerShell version 6 kan vi skapa ytterligare profiler. Två per aktuell användare och två för alla användare.
# | Profiltyp | Kommando | Host | Profilens filnamn | Profilen. File Location |
---|---|---|---|---|---|
1 | CurrentUserCurrentHost | $profile | Console | Microsoft.PowerShell_profile.ps1 | $HOME\ Documents\PowerShell\ |
2 | CurrentUserAllHosts | $profile.CurrentUserAllHosts | profile.ps1 | $HOME\ Documents\PowerShell\ | |
3 | AllUsersCurrentHost | $profile.AllUsersCurrentHost | Console | Microsoft.PowerShell_profile.ps1 | $PSHOME\ |
4 | AllUsersAllHosts | $profile.AllUsersAllHosts | profile.ps1 | $PSHOME\ |
Tabell 2 – PowerShell v6 Profiltyper, kommandon, värdar, filnamn, filplatser
Värdet för $HOME är vanligtvis C:\Users\user_name
Som regel är värdet för $PSHOME C:\Program Files\PowerShell\6
OBSERVERA: Skillnaden mellan mappnamnen i Documents PowerShell v6-mappen är PowerShell och mappnamnet för tidigare PowerShell-versioner är WindowsPowerShell.
Hur man skapar PowerShell-profil steg för steg
Här kommer jag att visa dig exakt hur du skapar en PowerShell-profil.
Skapa en PowerShell-profil för aktuell användare och aktuell värd
Det här är standardprofilen för Windows PowerShell.
Följ dessa steg för att skapa en PowerShell-profil för konsolen som värd och aktuell användare:
Steg 1: Öppna Windows PowerShell-konsolen (aktuell värd).
Steg 2: Först testar vi om profilen finns eller inte i vår PowerShell-installation. Skriv följande kommando i Window PowerShell Console och tryck på ENTER.
Test-Path $PROFILE
HEMMAR: Parametervärde för Test-Path CmdLåt oss hämta från Tabell 2 – Kommandokolumnen. ($profile, $profile.CurrentUserAllHosts, etc)
Steg 3: Om resultatet av föregående kommando är falskt finns profilen inte så gå till steg 4. Om resultatet är sant finns profilfilen så gå till steg 5
Steg 4: Eftersom profilen inte finns kommer vi att skapa en med följande kommando som du skriver och trycker på ENTER.
New-Item -Type File -Force $PROFILE
Steg 5: Profilen har skapats och vi kan öppna profilfilen i PowerShell ISE med följande kommando och trycka på ENTER.
ise $PROFILE
Steg 6: Tom profilfil har öppnats i Windows PowerShell ISE
Steg 7: Fortsätt till exempel 1 för att se hur du anpassar den här profilen.
Skapa en PowerShell-profil för aktuell användare och alla värdar
Följ de här stegen för att skapa en PowerShell-profil:
Steg 1: Öppna Windows PowerShell-konsolen (Detta är bara en valfri värddator för att köra kommandona och vi kan göra de här stegen från Windows PowerShell ISE också).
Steg 2: Först testar vi om profilen finns eller inte i vår PowerShell-installation. Skriv följande kommando i Windows PowerShell-konsolen och tryck på ENTER.
Test-Path $PROFILE.CurrentUserAllHosts
HEMMAR: Parametervärde för Test-Path CmdLåt oss hämta från Tabell 2 – Kommandokolumn. ($profile, $profile.CurrentUserAllHosts, etc)
Steg 3: Om resultatet av föregående kommando är falskt finns profilen inte så gå till steg 4. Om resultatet är sant finns profilfilen så gå till steg 5
Steg 4: Eftersom profilen inte finns kommer vi att skapa en med följande kommando som du skriver och trycker på ENTER.
New-Item -Type File -Force $PROFILE.CurrentUserAllHosts
Steg 5: Profilen har skapats och vi kan öppna profilfilen i PowerShell ISE med följande kommando och trycka på ENTER.
ise $PROFILE.CurrentUserAllHosts
Steg 6: Tom profilfil har öppnats i Windows PowerShell ISE
Steg 7: Fortsätt med exempel 2 för att se hur vi anpassar profilen.
Vi upprepar processen för andra profiltyper det enda är att använda rätt variabelvärde i kolumnen Command från Tabell 1 – PowerShell Profiltyper, kommandon, värdar, filnamn, filplatser.
- $profile.AllUsersCurrentHost
- $profile.AllUsersAllHosts
REMBER: När du vill skapa en profil för Windows PowerShell ISE som värd måste du öppna Windows PowerShell ISE och följa stegen och köra kommandona från Windows PowerShell ISE Console (se skärmdumpen nedan)
Hur man redigerar Windows PowerShell-profilen med exempel
Exempel 1 – Profil för konsolen som värd och aktuell användare (aktuell användare – aktuell värd)
Profilnamn: Microsoft.PowerShell_profile.ps1
Profilplats: $Home\Documents\WindowsPowerShell\
Används för:
Här är koden i profilen Microsoft.PowerShell_profile.ps1. Det är bara att kopiera koden i profilfilen och spara ändringarna för att få samma färgschema eller anpassa den efter dina önskemål.
Set-PSReadLineOption -colors @{ Operator = 'Cyan' Parameter = 'Cyan' String = 'White'}
På en del äldre system var inställningen av Set-PSReadLineOption CmdLet lite annorlunda som i exemplet nedan.
Set-PSReadlineOption -TokenKind String -ForegroundColor MagentaSet-PSReadlineOption -TokenKind Operator -ForegroundColor CyanSet-PSReadlineOption -TokenKind Parameter -ForegroundColor Cyan
Font colors have been changed from this…
… to this.
Använd Get-PSReadLineOption CmdLet för att se giltiga färgargument och aktuella argumentvärden (färger).
Exempel 2 – Profil för både Windows PowerShell Console och ISE som värdar (aktuell användare – alla värdar)
Profilnamn: profile.ps1
Profilens placering: $Home\Documents\WindowsPowerShell
Används för: När du vill anpassa både Windows PowerShell Console och ISE samtidigt eller köra egna avancerade funktioner eller CmdLets i både PowerShell Console och ISE.
I det här exemplet laddar jag mina egna PowerShell-moduler för några CmdLets som jag har skrivit och som är en del av Efficiency Booster PowerShell Project. Detta projekt är ett bibliotek med mina egna CmdLets organiserade i flera moduler och jag rekommenderar starkt att du laddar ner zip-filen med projektfilerna och testar i din egen miljö och kan följa mig i artiklarna på den här bloggen.
Här finns kommandon för att importera modulerna och innehållet i profilfilen.
Import-Module 02utilsImport-Module 03commonImport-Module 04maintenance
Vi kan snabbt testa att importerade moduler verkligen laddas när vi öppnar PowerShell-konsolen med följande kommando:
Get-Module -ListAvailable
För att bättre förstå hur PowerShell-profiler, -moduler och CmdLets är sammankopplade, läs följande underrubrik i det här inlägget: Hur man organiserar sina egna PowerShell CmdLets i PowerShell-moduler och vilken profil man ska använda för att organisera den strukturen och hur vi kopplar samman PowerShell-profiler, -moduler och CmdLet.
Exempel 3 – Profil för ISE som värd (aktuell användare – aktuell värd)
Profilnamn: Microsoft.PowerShellISE_profile.ps1
Profilplats: $Home\Documents\WindowsPowerShell\
Används för:
Här är kommandot som måste kopieras i profilfilen.
Import-Module 09addons
Som ett resultat av detta kommer vi att ha två tillägg i Windows PowerShell ISE. Läs de här två artiklarna för att få veta mer om hur de ska kodas.
- Hur man skriver avancerade funktioner eller CmdLets med PowerShell (snabbt)
- Hur man skriver PowerShell-funktioner eller CmdLets hjälp (snabbt)
Vi kan snabbt testa att importerade moduler verkligen laddas när vi öppnar PowerShell-konsolen med följande kommando:
Get-Module -ListAvailable
Anmärkningar: Windows PowerShell ISE importerar fyra modeller från två profilfiler ( profile.ps1 och Microsoft.PowerShellISE_profile.ps1 ).
Exempel 4 – Profil för både Windows PowerShell Console och ISE som värdar (alla användare – alla värdar)
Profilnamn: profile.ps1
Profilplats: $PSHOME\
Används för: I det här exemplet har jag bara ändrat titeln på Window PowerShell Console och ISE för både Current User och Administrator.
Här är koden i profilfilen:
$NTIdentity = ::GetCurrent()$NTPrincipal = new-object Security.Principal.WindowsPrincipal $NTIdentity$IsAdmin = $NTPrincipal.IsInRole(::Administrator)$hostversion="v$($Host.Version.Major).$($Host.Version.Minor)"$hostname = $host.NameIF ($IsAdmin){ if($hostname -eq "ConsoleHost") { $host.ui.RawUI.WindowTitle = "Your Text in Windows PowerShell $hostversion - Running as ADMINISTRATOR" } else { $host.ui.RawUI.WindowTitle = "Your Text in Windows PowerShell ISE $hostversion - Running as ADMINISTRATOR" }}Else{ if($hostname -eq "ConsoleHost") { $host.ui.RawUI.WindowTitle = "Your Text in Windows PowerShell $hostversion" } else { $host.ui.RawUI.WindowTitle = "Your Text in Windows PowerShell ISE $hostversion" }}
Du kan se att både PowerShell Console och ISE-titlarna har en anpassad text, namnet på värddatorn och versionen av PowerShell i titeln.
Användbara PowerShell-kommandon om profiler
Här är några användbara PowerShell-kommandon som hjälper dig att få information om profiler.
Som ett resultat av att köra något av profilkommandona får du platsen för profilfilen.
$profile$profile.AllUsersCurrentHost$profile.CurrentUserAllHosts$profile.AllUsersAllHosts
VIKTIGT: När du vill hitta platsen för profilfilen för Windows PowerShell ISE som värddator måste du öppna Windows PowerShell ISE och köra profilkommandon från Windows PowerShell ISE Console
Använd Test-Path CmdLet för att kontrollera om profilfilen finns på systemet eller inte. Om du får True som resultat finns profilen och false betyder att profilfilen inte finns. Använd kommandon från Tabell 1 – PowerShell-profiltyper, kommandon, värdar, filnamn och filplatser för att söka efter andra profiltyper, oavsett om de finns eller inte.
Test-Path $PROFILE
Denna kodrad skapar en profilfil. Använd kommandon från tabell 1 – PowerShell Profile types, commands, hosts, file names, file locations för att skapa andra profiltyper.
New-Item -Type File -Force $PROFILE.CurrentUserAllHosts
Om du vill läsa innehållet i profilfilen antingen i Anteckningsblock eller i Window PowerShell ISE så använd dessa två kommandon.
ise $PROFILEnotepad $PROFILE
Personligen föredrar jag Windows PowerShell ISE eftersom det är en bekvämare miljö för att skriva PowerShell-kod.
Använd den här kodraden för att få fram profilplatser för alla profiltyper.
$profile | Get-Member -Type NoteProperty | Select-Object Definition
Kontrollera dessa två variabler för att få fram platsen för PowerShell-installationen respektive hemkatalogen.
$pshome$home
Hur du väljer vilken profilfil du ska använda
Om du använder flera värdprogram som Windows PowerShell Console och ISE lägger du alla anpassningar i profilen $PROFILE.CurrentUserAllHosts för den nuvarande inloggade användaren. Jag har till exempel skapat mina egna CmdLets organiserade i moduler så jag lägger kommandon för att ladda dessa moduler i den här profilen eftersom jag vill att modulerna ska laddas både när vi öppnar PowerShell Console och ISE. Se exempel 2 för illustration.
Om du vill göra specifika anpassningar av värdprogrammet lägger du all anpassningskod i en profil som är specifik för det värdprogrammet. Jag ändrar till exempel bakgrundsfärgen på teckensnitten i PowerShell Console så att de blir mer synliga eller så har jag laddat moduler som är tilläggsmoduler för ISE. Jag har visat detta i exempel 1 för PowerShell Console och exempel 3 för PowerShell ISE.
Om du behöver anpassa PowerShell för många användare och du är administratör så följ de här tipsen:
- Lagra den vanligaste anpassningen i $PROFILE.AllUsersAllHosts-profilen eftersom detta är det bredaste tillämpningsområdet
- Om du vill anpassa Windows PowerShell för alla användare men specifikt för ett värdprogram. Till exempel, olika anpassning för Windows PowerShell Console och en annan anpassning för Windows PowerShell ISE så lägg koden i $PROFILE.AllUsersCurrentHost profiler
- Skriv koden för särskilda användare i de användarspecifika profilerna. I princip innebär det att du använder antingen profilen $PROFILE.CurrentUserAllHosts eller $PROFILE.CurrentUserCurrentHost.
Så här kör du Console eller ISE utan inlästa profiler
Öppna dialogrutan Kör Win + R och öppna PowerShell med alternativet -NoProfile.
PowerShell.exe -NoProfile
Varning: PowerShell Load Time
Med en större och mer komplex profil kan det börja påverka hur snabbt PowerShell öppnas. Om du vill felsöka om din profil är ansvarig för dåliga laddningstider för PowerShell öppnar du dialogrutan Kör Win + R och öppnar PowerShell med alternativet -NoProfile.
PowerShell.exe -NoProfile
Profiler och fjärrsessioner
PowerShell-profiler körs inte automatiskt i fjärrsessioner, så de kommandon som profilerna lägger till finns inte med i fjärrsessionen. Dessutom fylls inte den automatiska variabeln $PROFILE i fjärrsessioner.
Om du vill köra en profil i en session använder du Invoke-Command CmdLet.
Till exempel körs följande kommando profilen ”Current user, Current Host” från den lokala datorn i sessionen i $s.
Invoke-Command -Session $s -FilePath $PROFILE
Hur du organiserar dina egna PowerShell CmdLets i PowerShell-moduler och profiler
För att du ska förstå kopplingen mellan PowerShell-profil, modul och CmdLet har jag skapat Efficiency Booster PowerShell-projektet med massor av mina egna CmdLets organiserade i ett gäng moduler som laddas i varje PowerShell-session med PowerShell-profilen när jag öppnar Windows PowerShell Console eller ISE.
Du får gärna ladda ner zip-filen som innehåller koden för projektet så att du enkelt kan följa med. I filen ReadMe.txt finns en förklaring av installations- och anpassningssteg så läs instruktionerna i den filen. Ännu bättre kan du läsa instruktionerna för installation och anpassning genom att läsa följande artikel How To Install And Configure PowerShell:
Jag kommer att använda bokhandel, bokhyllor och böcker analogi för att förklara kopplingen mellan Powershell Profile, Module och CmdLet.
Föreställ dig till exempel att du vill lära dig mer om PowerShell Scripting och du vill köpa några böcker i ämnet från bokhandeln.
Du går in i bokhandeln och ser många hyllor med olika etiketter för bokavdelningar som konst, affärer, datorer, litteratur, resor osv. Naturligtvis går du till hyllorna med etiketten Datorer och där hittar du boken som förklarar PowerShell Scripting som du vill köpa.
Vi återvänder nu till PowerShell-världen och kopplar ihop den analoga berättelsen med PowerShell:
- Den CmdLet som vi använder som levereras med PowerShell eller någon egen skriven CmdLet är boken.
- Koden i den CmdLet är innehållet i boken.
- PowerShell Module är bokhandelshyllan i någon bokhandelsavdelning som till exempel Computers bookstore department shelf där vår bok är placerad.
- Finally, PowerShell Profile is the bookstore itself.
Så varje gång vi öppnar Windows PowerShell Console eller ISE öppnar vi vår session och med den sessionen profilfiler för att ladda och anpassning har gjorts för att ställa in vår PowerShell-miljö som vi vill vara.
I fallet med Modules och CmdLets. Profilfilen kommer att importera moduler och Module kommer att ladda varje CmdLet-skript som tillhör den modulen.
Då jag gillar att använda mina egna CmdLets både i Windows PowerShell Console och ISE-värdprogram föredrar jag att skapa en $profile.CurrentUserAllHosts profiltyp som inte är något annat än Profile.ps1-filen som skapas i:
- $Home\ Documents\WindowsPowerShell\-mappen för PowerShell version 5.1 och äldre
- $Home\ Documents\PowerShell\-mappen för PowerShell version 6.0.
Hur vi länkar samman PowerShell-profilen, modul, Och CmdLet
Här är en kort beskrivning av den strukturen som görs i PowerShell
- Skapa en PowerShell-profil
- Skapa en modulmapp och filstruktur
- Anpassa profilen för att importera nödvändiga moduler
- Skapa CmdLet PowerShell-skript
- Skriv egen CmdLet-funktionskod
- Anpassa modulfilen för att importera CmdLet-skriptet
Jag kommer att illustrera den här processen med exempel på Efficiency Booster PowerShell-projektet med profil, Modules och CmdLets så att det är lättare för alla att förstå hela processen. Så jag uppmuntrar återigen starkt alla att installera den medföljande zip-filen.
Följ dessa steg för att skapa en PowerShell-profil, modul, CmdLet och länka ihop dem:
Steg 1: Öppna Windows PowerShell-konsolen
Steg 2: Först testar vi om Profile finns eller inte i vår PowerShell-installation. Skriv följande kommando i Windows PowerShell och tryck på ENTER
Test-Path $PROFILE.CurrentUserAllHosts
Steg 3: Om resultatet av föregående kommando är falskt finns profilen inte, så gå till steg 4. Om resultatet är sant finns profilfilen så gå till steg 5
Steg 4: Eftersom profilen inte finns kommer vi att skapa en med följande kommando som du skriver in och trycker på ENTER.
New-Item -Type File -Force $PROFILE.CurrentUserAllHosts
Steg 5: Profilen har skapats och vi kan öppna profilfilen i PowerShell ISE med följande kommando och trycka på ENTER.
ise $PROFILE.CurrentUserAllHosts
Steg 6: Profilfilen har öppnats i PowerShell ISE.
Steg 7: Nu måste vi skapa en modulmappstruktur och nödvändiga filer.
Steg 8: I mappen där vi skapade vår profilfil skapar vi en modulmapp med det exakta namnet Modules. Här kommer vi att hålla mappstrukturen för alla våra moduler.
Steg 9: I Modules-mappen skapar du mapparna för varje modul som du vill ha. Jag har till exempel skapat följande moduler i Efficiency Booster PowerShell Project.
Steg 10: I varje modulmapp skapar vi filen med tillägget .psm1 och exakt samma namn som modulmappen. I mappen 03common skapar vi till exempel filen 03common.psm1
Steg 11: Eventuellt kan vi skapa en manifestfil (.psd1-tillägget) för varje modul som beskriver mappen ytterligare.
Steg 12: I samma modulmapp skapar vi filen med tillägget .ps1 (vanlig PowerShell-skriptfil) där vi kommer att skriva koden för vår egen CmdLet. Vi kan till exempel skapa filen GetCPUInfo.ps1 där vi skriver koden för vår egen Get-CPUInfo CmdLet.
Steg 13: Nu är vi redo att skriva vår egen CmdLet-kod och skriva skript för den. Titta gärna på exempel Get-CPUInfo och andra CmdLets i Efficiency Booster PowerShell-projektet. I framtida inlägg kommer jag att skriva mer detaljerat om varje CmdLet i projektet. För tillfället kan du ladda ner projektets källkod här:
Steg 14: Länka ett CmdLet-skript till rätt PowerShell-modul. Öppna modulens .psm1-fil och skriv den här kodraden:
. $psScriptRoot\NameOfCmdLetScriptFile.ps1
För Get-CPUInfo CmdLet skriver vi till exempel den här kodraden i 03common.psm1 file:
. $psScriptRoot\GetCPUInfo.ps1
Steg 15: I profilscriptfilen importerar vi modulen som innehåller vår CmdLet-skriptfil, så vi skriver det här kommandot i profilen.
Import-Module ModuleName
Till exempel är vår Get-CPUInfo CmdLet en del av 03common-modulen så vi skriver den här koden i profilen:
Import-Module 03common
Steg 16: Vi upprepar stegen 9-15 för alla moduler och CmdLet som vi vill ha i vår profil och som ska laddas med varje PowerShell-session som vi startar.
Steg 17: Vi testar att alla importerade moduler laddas när vi öppnar en viss värd. Vi kan lista moduler med följande kommando:
Get-Module -ListAvailable
Steg 18: Vi kan testa att alla CmdLets inom varje modul laddas in i miljön. Här är ett användbart exempelkommando:
Get-Command -Module 02utils