Was ist in Ihrer PowerShell-Datei "profile.ps1"? [geschlossen]

85

Welche wesentlichen Dinge (Funktionen, Aliase, Startskripte) haben Sie in Ihrem Profil?

sd
quelle

Antworten:

23

Ich brauche oft einige grundlegende Agregate, um einige Dinge zu zählen / zu summieren. Ich habe diese Funktionen definiert und benutze sie oft. Sie funktionieren wirklich gut am Ende einer Pipeline:

#
# useful agregate
#
function count
{
    BEGIN { $x = 0 }
    PROCESS { $x += 1 }
    END { $x }
}

function product
{
    BEGIN { $x = 1 }
    PROCESS { $x *= $_ }
    END { $x }
}

function sum
{
    BEGIN { $x = 0 }
    PROCESS { $x += $_ }
    END { $x }
}

function average
{
    BEGIN { $max = 0; $curr = 0 }
    PROCESS { $max += $_; $curr += 1 }
    END { $max / $curr }
}

Um Zeit und Weg mit Farben in meiner Eingabeaufforderung zu erhalten:

function Get-Time { return $(get-date | foreach { $_.ToLongTimeString() } ) }
function prompt
{
    # Write the time 
    write-host "[" -noNewLine
    write-host $(Get-Time) -foreground yellow -noNewLine
    write-host "] " -noNewLine
    # Write the path
    write-host $($(Get-Location).Path.replace($home,"~").replace("\","/")) -foreground green -noNewLine
    write-host $(if ($nestedpromptlevel -ge 1) { '>>' }) -noNewLine
    return "> "
}

Die folgenden Funktionen wurden aus einem Blog gestohlen und an meinen Geschmack angepasst, aber ls mit Farben ist sehr schön:

# LS.MSH 
# Colorized LS function replacement 
# /\/\o\/\/ 2006 
# http://mow001.blogspot.com 
function LL
{
    param ($dir = ".", $all = $false) 

    $origFg = $host.ui.rawui.foregroundColor 
    if ( $all ) { $toList = ls -force $dir }
    else { $toList = ls $dir }

    foreach ($Item in $toList)  
    { 
        Switch ($Item.Extension)  
        { 
            ".Exe" {$host.ui.rawui.foregroundColor = "Yellow"} 
            ".cmd" {$host.ui.rawui.foregroundColor = "Red"} 
            ".msh" {$host.ui.rawui.foregroundColor = "Red"} 
            ".vbs" {$host.ui.rawui.foregroundColor = "Red"} 
            Default {$host.ui.rawui.foregroundColor = $origFg} 
        } 
        if ($item.Mode.StartsWith("d")) {$host.ui.rawui.foregroundColor = "Green"}
        $item 
    }  
    $host.ui.rawui.foregroundColor = $origFg 
}

function lla
{
    param ( $dir=".")
    ll $dir $true
}

function la { ls -force }

Und einige Verknüpfungen, um sich wirklich wiederholende Filteraufgaben zu vermeiden:

# behave like a grep command
# but work on objects, used
# to be still be allowed to use grep
filter match( $reg )
{
    if ($_.tostring() -match $reg)
        { $_ }
}

# behave like a grep -v command
# but work on objects
filter exclude( $reg )
{
    if (-not ($_.tostring() -match $reg))
        { $_ }
}

# behave like match but use only -like
filter like( $glob )
{
    if ($_.toString() -like $glob)
        { $_ }
}

filter unlike( $glob )
{
    if (-not ($_.tostring() -like $glob))
        { $_ }
}
Raoul Supercopter
quelle
2
Dieser Kommentar bringt keinen Wert, aber ich möchte nur sagen, dass Ihr Benutzername fantastisch ist.
chrisf
Gibt es nicht ein Scoping-Problem? Sind nicht alle in einem Skript definierten Funktionen (oder Aliase), einschließlich eines PowerShell-Skripts, auf die Skriptausführung beschränkt und werden in der aufrufenden Shell verdampft? Dies ist bei meiner Maschine der Fall. Was soll ich machen?
Uri
10

Um meine Visual Studio-Buildumgebung von PowerShell aus einzurichten, habe ich von hier aus VsVars32 verwendet . und benutze es die ganze Zeit.

#################################################### ###############################
# Macht die Umgebungsvariablen in einem Stapel verfügbar und legt sie in dieser PS-Sitzung fest
#################################################### ###############################
Funktion Get-Batchfile ($ file) 
{
    $ theCmd = "` "$ file`" & set " 
    cmd / c $ theCmd | Foreach-Objekt {
        $ thePath, $ theValue = $ _. split ('=')
        Set-Item -path env: $ thePath -value $ theValue
    }}
}}


#################################################### ###############################
# Legt die VS-Variablen für diese PS-Sitzung fest
#################################################### ###############################
Funktion VsVars32 ($ version = "9.0")
{
    $ theKey = "HKLM: SOFTWARE \ Microsoft \ VisualStudio \" + $ version
    $ theVsKey = get-ItemProperty $ theKey
    $ theVsInstallPath = [System.IO.Path] :: GetDirectoryName ($ theVsKey.InstallDir)
    $ theVsToolsDir = [System.IO.Path] :: GetDirectoryName ($ theVsInstallPath)
    $ theVsToolsDir = [System.IO.Path] :: Combine ($ theVsToolsDir, "Tools")
    $ theBatchFile = [System.IO.Path] :: Combine ($ theVsToolsDir, "vsvars32.bat")
    Get-Batchfile $ theBatchFile
    [System.Console] :: Title = "Visual Studio" + $ version + "Windows Powershell"
}}
Scott Saad
quelle
1
Ich benutze leeholmes.com/blog/… , um vcvars aufzurufen.
Jay Bazuzi
Das obige Skript funktioniert unter 64-Bit-Windows nicht (aufgrund der WOW64-Registrierungsumleitung).
Govert
Führen Sie es in diesem Fall einfach in der 32-Bit-Shell WOW64 cmd.exe aus. War das nicht möglich
Djangofan
10

Dies durchläuft ein Skript PSDrive und punktiert alles, was mit "lib-" beginnt.

### ---------------------------------------------------------------------------
### Load function / filter definition library
### ---------------------------------------------------------------------------

    Get-ChildItem scripts:\lib-*.ps1 | % { 
      . $_
      write-host "Loading library file:`t$($_.name)"
    }
halr9000
quelle
9

Start-Transkript . Dadurch wird Ihre gesamte Sitzung in eine Textdatei geschrieben. Hervorragend geeignet, um neue Mitarbeiter in der Verwendung von Powershell in der Umwelt zu schulen.

jwmiller5
quelle
2
+1 Danke für den Tipp ... Das hat mein Problem mit der Protokollierung eines Continuous Integration-Builds sowohl in der Konsole als auch in einer Protokolldatei behoben. Ich bin enttäuscht, dass es weder in "Windows Powershell Pocket Reference" noch in "Windows PowerShell in Action" gut dokumentiert ist. Ich denke, das lernst du aus der Praxis.
Peter Walke
Als Heads-up ist der Befehl Start-Transcript nicht auf allen PowerShell-Hosts verfügbar, sodass das Einfügen in ein hostunabhängiges Profil (profile.ps1) in einigen Kontexten zu Fehlern führen kann. Dies kann in hostspezifischen Profilen wie (Microsoft.PowerShellISE_profile.ps1) hilfreich sein.
Burt_Harris
9

Meine Eingabeaufforderung enthält:

$width = ($Host.UI.RawUI.WindowSize.Width - 2 - $(Get-Location).ToString().Length)
$hr = New-Object System.String @('-',$width)
Write-Host -ForegroundColor Red $(Get-Location) $hr

Das gibt mir eine Aufteilung zwischen Befehlen, die beim Zurückblättern leicht zu erkennen ist. Es zeigt mir auch das aktuelle Verzeichnis, ohne horizontalen Platz in der Zeile zu verwenden, in die ich tippe.

Beispielsweise:

C: \ Users \ Jay ---------------------------------------- -------------------------------------------------- ------------
[1] PS>

Jay Bazuzi
quelle
7

Hier ist mein nicht so subtiles Profil


    #==============================================================================
# Jared Parsons PowerShell Profile ([email protected]) 
#==============================================================================

#==============================================================================
# Common Variables Start
#==============================================================================
$global:Jsh = new-object psobject 
$Jsh | add-member NoteProperty "ScriptPath" $(split-path -parent $MyInvocation.MyCommand.Definition) 
$Jsh | add-member NoteProperty "ConfigPath" $(split-path -parent $Jsh.ScriptPath)
$Jsh | add-member NoteProperty "UtilsRawPath" $(join-path $Jsh.ConfigPath "Utils")
$Jsh | add-member NoteProperty "UtilsPath" $(join-path $Jsh.UtilsRawPath $env:PROCESSOR_ARCHITECTURE)
$Jsh | add-member NoteProperty "GoMap" @{}
$Jsh | add-member NoteProperty "ScriptMap" @{}

#==============================================================================

#==============================================================================
# Functions 
#==============================================================================

# Load snapin's if they are available
function Jsh.Load-Snapin([string]$name) {
    $list = @( get-pssnapin | ? { $_.Name -eq $name })
    if ( $list.Length -gt 0 ) {
        return; 
    }

    $snapin = get-pssnapin -registered | ? { $_.Name -eq $name }
    if ( $snapin -ne $null ) {
        add-pssnapin $name
    }
}

# Update the configuration from the source code server
function Jsh.Update-WinConfig([bool]$force=$false) {

    # First see if we've updated in the last day 
    $target = join-path $env:temp "Jsh.Update.txt"
    $update = $false
    if ( test-path $target ) {
        $last = [datetime] (gc $target)
        if ( ([DateTime]::Now - $last).Days -gt 1) {
            $update = $true
        }
    } else {
        $update = $true;
    }

    if ( $update -or $force ) {
        write-host "Checking for winconfig updates"
        pushd $Jsh.ConfigPath
        $output = @(& svn update)
        if ( $output.Length -gt 1 ) {
            write-host "WinConfig updated.  Re-running configuration"
            cd $Jsh.ScriptPath
            & .\ConfigureAll.ps1
            . .\Profile.ps1
        }

        sc $target $([DateTime]::Now)
        popd
    }
}

function Jsh.Push-Path([string] $location) { 
    go $location $true 
}
function Jsh.Go-Path([string] $location, [bool]$push = $false) {
    if ( $location -eq "" ) {
        write-output $Jsh.GoMap
    } elseif ( $Jsh.GoMap.ContainsKey($location) ) {
        if ( $push ) {
            push-location $Jsh.GoMap[$location]
        } else {
            set-location $Jsh.GoMap[$location]
        }
    } elseif ( test-path $location ) {
        if ( $push ) {
            push-location $location
        } else {
            set-location $location
        }
    } else {
        write-output "$loctaion is not a valid go location"
        write-output "Current defined locations"
        write-output $Jsh.GoMap
    }
}

function Jsh.Run-Script([string] $name) {
    if ( $Jsh.ScriptMap.ContainsKey($name) ) {
        . $Jsh.ScriptMap[$name]
    } else {
        write-output "$name is not a valid script location"
        write-output $Jsh.ScriptMap
    }
}


# Set the prompt
function prompt() {
    if ( Test-Admin ) { 
        write-host -NoNewLine -f red "Admin "
    }
    write-host -NoNewLine -ForegroundColor Green $(get-location)
    foreach ( $entry in (get-location -stack)) {
        write-host -NoNewLine -ForegroundColor Red '+';
    }
    write-host -NoNewLine -ForegroundColor Green '>'
    ' '
}

#==============================================================================

#==============================================================================
# Alias 
#==============================================================================
set-alias gcid      Get-ChildItemDirectory
set-alias wget      Get-WebItem
set-alias ss        select-string
set-alias ssr       Select-StringRecurse 
set-alias go        Jsh.Go-Path
set-alias gop       Jsh.Push-Path
set-alias script    Jsh.Run-Script
set-alias ia        Invoke-Admin
set-alias ica       Invoke-CommandAdmin
set-alias isa       Invoke-ScriptAdmin
#==============================================================================

pushd $Jsh.ScriptPath

# Setup the go locations
$Jsh.GoMap["ps"]        = $Jsh.ScriptPath
$Jsh.GoMap["config"]    = $Jsh.ConfigPath
$Jsh.GoMap["~"]         = "~"

# Setup load locations
$Jsh.ScriptMap["profile"]       = join-path $Jsh.ScriptPath "Profile.ps1"
$Jsh.ScriptMap["common"]        = $(join-path $Jsh.ScriptPath "LibraryCommon.ps1")
$Jsh.ScriptMap["svn"]           = $(join-path $Jsh.ScriptPath "LibrarySubversion.ps1")
$Jsh.ScriptMap["subversion"]    = $(join-path $Jsh.ScriptPath "LibrarySubversion.ps1")
$Jsh.ScriptMap["favorites"]     = $(join-path $Jsh.ScriptPath "LibraryFavorites.ps1")
$Jsh.ScriptMap["registry"]      = $(join-path $Jsh.ScriptPath "LibraryRegistry.ps1")
$Jsh.ScriptMap["reg"]           = $(join-path $Jsh.ScriptPath "LibraryRegistry.ps1")
$Jsh.ScriptMap["token"]         = $(join-path $Jsh.ScriptPath "LibraryTokenize.ps1")
$Jsh.ScriptMap["unit"]          = $(join-path $Jsh.ScriptPath "LibraryUnitTest.ps1")
$Jsh.ScriptMap["tfs"]           = $(join-path $Jsh.ScriptPath "LibraryTfs.ps1")
$Jsh.ScriptMap["tab"]           = $(join-path $Jsh.ScriptPath "TabExpansion.ps1")

# Load the common functions
. script common
. script tab
$global:libCommonCertPath = (join-path $Jsh.ConfigPath "Data\Certs\jaredp_code.pfx")

# Load the snapin's we want
Jsh.Load-Snapin "pscx"
Jsh.Load-Snapin "JshCmdlet" 

# Setup the Console look and feel
$host.UI.RawUI.ForegroundColor = "Yellow"
if ( Test-Admin ) {
    $title = "Administrator Shell - {0}" -f $host.UI.RawUI.WindowTitle
    $host.UI.RawUI.WindowTitle = $title;
}

# Call the computer specific profile
$compProfile = join-path "Computers" ($env:ComputerName + "_Profile.ps1")
if ( -not (test-path $compProfile)) { ni $compProfile -type File | out-null }
write-host "Computer profile: $compProfile"
. ".\$compProfile"
$Jsh.ScriptMap["cprofile"] = resolve-path ($compProfile)

# If the computer name is the same as the domain then we are not 
# joined to active directory
if ($env:UserDomain -ne $env:ComputerName ) {
    # Call the domain specific profile data
    write-host "Domain $env:UserDomain"
    $domainProfile = join-path $env:UserDomain "Profile.ps1"
    if ( -not (test-path $domainProfile))  { ni $domainProfile -type File | out-null }
    . ".\$domainProfile"
}

# Run the get-fortune command if JshCmdlet was loaded
if ( get-command "get-fortune" -ea SilentlyContinue ) {
    get-fortune -timeout 1000
}

# Finished with the profile, go back to the original directory
popd

# Look for updates
Jsh.Update-WinConfig

# Because this profile is run in the same context, we need to remove any 
# variables manually that we don't want exposed outside this script

JaredPar
quelle
Wo kopiere ich die profile.ps1? Muss der Computer neu gestartet werden, um den WinRM-Dienst neu zu starten?
Kiquenet
@Kiquenet, starte einfach deine Powershell-Sitzung neu.
Christopher Douglas
+1, sehr schön segmentiert. Vielen Dank.
Sabuncu
7

Ich rocke ein paar Funktionen und da ich ein Modulautor bin, lade ich normalerweise eine Konsole und muss unbedingt wissen, was wo ist.

write-host "Your modules are..." -ForegroundColor Red
Get-module -li

Stirb hart nerding:

function prompt
{
    $host.UI.RawUI.WindowTitle = "ShellPower"
    # Need to still show the working directory.
    #Write-Host "You landed in $PWD"

    # Nerd up, yo.
    $Str = "Root@The Matrix"
    "$str> "
}

Die obligatorischen PowerShell-Funktionen, die ich kann, finden Sie hier ...

# Explorer command
function Explore
{
    param
        (
            [Parameter(
                Position = 0,
                ValueFromPipeline = $true,
                Mandatory = $true,
                HelpMessage = "This is the path to explore..."
            )]
            [ValidateNotNullOrEmpty()]
            [string]
            # First parameter is the path you're going to explore.
            $Target
        )
    $exploration = New-Object -ComObject shell.application
    $exploration.Explore($Target)
}

Ich bin NOCH ein Administrator, also brauche ich ...

Function RDP
{
    param
        (
            [Parameter(
                    Position = 0,
                    ValueFromPipeline = $true,
                    Mandatory = $true,
                    HelpMessage = "Server Friendly name"
            )]
            [ValidateNotNullOrEmpty()]
            [string]
            $server
        )

    cmdkey /generic:TERMSRV/$server /user:$UserName /pass:($Password.GetNetworkCredential().Password)
    mstsc /v:$Server /f /admin
    Wait-Event -Timeout 5
    cmdkey /Delete:TERMSRV/$server
}

Manchmal möchte ich den Explorer als eine andere Person als den angemeldeten Benutzer starten ...

# Restarts explorer as the user in $UserName
function New-Explorer
{
    # CLI prompt for password

    taskkill /f /IM Explorer.exe
    runas /noprofile /netonly /user:$UserName explorer
}

Das ist nur, weil es lustig ist.

Function Lock-RemoteWorkstation
{
    param(
        $Computername,
        $Credential
    )

    if(!(get-module taskscheduler))
    {
        Import-Module TaskScheduler
    }
    New-task -ComputerName $Computername -credential:$Credential |
        Add-TaskTrigger -In (New-TimeSpan -Seconds 30) |
        Add-TaskAction -Script `
        {
            $signature = @"
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool LockWorkStation();
            "@
                $LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru
                $LockWorkStation::LockWorkStation() | Out-Null
        } | Register-ScheduledTask TestTask -ComputerName $Computername -credential:$Credential
}

Ich habe auch eine für mich, da Win+ Lzu weit weg ist ...

Function llm # Lock Local machine
{
    $signature = @"
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool LockWorkStation();
    "@
        $LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru

        $LockWorkStation::LockWorkStation() | Out-Null
}

Ein paar Filter? Ich glaube schon...

 filter FileSizeBelow($size){if($_.length -le $size){ $_ }}
 filter FileSizeAbove($size){if($_.Length -ge $size){$_}}

Ich habe auch einige, die ich noch nicht veröffentlichen kann, da sie noch nicht fertig sind, aber im Grunde eine Möglichkeit sind, Anmeldeinformationen zwischen Sitzungen beizubehalten, ohne sie als verschlüsselte Datei zu schreiben.

Christopher Douglas
quelle
Nettes Zeug hier, ich würde mich für Ihre Lösung interessieren, um Anmeldeinformationen zwischen Sitzungen beizubehalten, ohne sie in eine Datei zu schreiben.
JKDBA
@jkdba stellt sich heraus, dass ich sie in eine Datei geschrieben habe. Der Haken ist, dass nur meine Sitzung die Datei entschlüsseln kann und nur auf meinem Computer. Probieren Sie es aus und lassen Sie mich wissen, ob es für Sie funktioniert.
Christopher Douglas
1
Hmm Interessant, ich habe im Grunde mit der gleichen Idee gespielt, aber stattdessen habe ich eine Keepass-Datenbank verwendet und dann mein Profil so konfiguriert, dass eine Verbindung zur Datenbank hergestellt und meine Anmeldeinformationen als sichere Zeichenfolge abgerufen und ein Anmeldeinformationsobjekt erstellt werden . Ich habe an einem noblen Keepass-Code-Wrapper für deren SDK gearbeitet. Sie finden ihn auf Git mit meinem Benutzernamen Repo namens PSKeePass (siehe Entwickler-Zweig ab sofort). Er kann leicht erweitert werden, um ein Netzwerk-Login und eine Schlüsseldatei für zu verwenden Zusätzliche, aber einfache Sicherheit, um einen ähnlichen Effekt wie bei Ihrer Arbeit zu erzielen.
JKDBA
@jkdba das ist super! Ich werde auf jeden Fall Ihren Code überprüfen und einen Beitrag leisten, wenn ich kann. Ich bin ein großer Fan von Keepass, hatte aber nie die Gelegenheit, ihr SDK mit PS zu verwenden. Vielen Dank!
Christopher Douglas
6
# ----------------------------------------------------------
# msdn search for win32 APIs.
# ----------------------------------------------------------

function Search-MSDNWin32
{

    $url = 'http://search.msdn.microsoft.com/?query=';

    $url += $args[0];

    for ($i = 1; $i -lt $args.count; $i++) {
        $url += '+';
        $url += $args[$i];
    }

    $url += '&locale=en-us&refinement=86&ac=3';

    Open-IE($url);
}

# ----------------------------------------------------------
# Open Internet Explorer given the url.
# ----------------------------------------------------------

function Open-IE ($url)
{    
    $ie = new-object -comobject internetexplorer.application;

    $ie.Navigate($url);

    $ie.Visible = $true;
}
user15071
quelle
2
Stattdessen verwende Open-IEich den eingebauten iiAlias ​​für Invoke-Item.
Jay Bazuzi
1
ii " google.com " funktioniert nicht. Wie benutzt du es, Jay?
Kevin Berridge
Versuchen Siestart http://google.com
orad
5

Ich füge diese Funktion hinzu, damit ich die Festplattennutzung leicht sehen kann:

function df {
    $colItems = Get-wmiObject -class "Win32_LogicalDisk" -namespace "root\CIMV2" `
    -computername localhost

    foreach ($objItem in $colItems) {
        write $objItem.DeviceID $objItem.Description $objItem.FileSystem `
            ($objItem.Size / 1GB).ToString("f3") ($objItem.FreeSpace / 1GB).ToString("f3")

    }
}
nabiy
quelle
5

apropos.

Obwohl ich denke, dass dies durch eine aktuelle oder bevorstehende Veröffentlichung ersetzt wurde.

############################################################################## 
## Search the PowerShell help documentation for a given keyword or regular 
## expression.
## 
## Example:
##    Get-HelpMatch hashtable
##    Get-HelpMatch "(datetime|ticks)"
############################################################################## 
function apropos {

    param($searchWord = $(throw "Please specify content to search for"))

    $helpNames = $(get-help *)

    foreach($helpTopic in $helpNames)
    {
       $content = get-help -Full $helpTopic.Name | out-string
       if($content -match $searchWord)
       { 
          $helpTopic | select Name,Synopsis
       }
    }
}
Ed Guiness
quelle
Ja, Get-Help sucht jetzt nach Themeninhalten.
Keith Hill
5

Ich behalte ein bisschen von allem. Meistens richtet mein Profil die gesamte Umgebung ein (einschließlich des Aufrufs von Skripten zum Einrichten meiner .NET / VS- und Java-Entwicklungsumgebung).

Ich definiere die prompt()Funktion auch mit meinem eigenen Stil neu ( siehe in Aktion ) und richte mehrere Aliase für andere Skripte und Befehle ein. und ändern Sie, auf was $HOMEzeigt.

Hier ist mein komplettes Profilskript .

tomasr
quelle
4
Set-PSDebug -Strict 

Sie werden davon profitieren, wenn Sie jemals nach einem dummen Tippfehler gesucht haben, z. Ausgabe von $ varsometext anstelle von $ var sometext

icnivad
quelle
Ich mache regelmäßig Tippfehler. Es ist sehr demütig zu erkennen, dass der Code, den Sie nur etwa 12 Mal ändern, in jede Richtung funktioniert, aber Sie können den Namen der Eigenschaft immer noch nicht richtig buchstabieren.
Christopher Douglas
3
############################################################################## 
# Get an XPath Navigator object based on the input string containing xml
function get-xpn ($text) { 
    $rdr = [System.IO.StringReader] $text
    $trdr = [system.io.textreader]$rdr
    $xpdoc = [System.XML.XPath.XPathDocument] $trdr
    $xpdoc.CreateNavigator()
}

Nützlich für die Arbeit mit XML, z. B. für die Ausgabe von SVN-Befehlen mit --xml.

Ed Guiness
quelle
3

Dadurch wird ein Skript: Laufwerk erstellt und Ihrem Pfad hinzugefügt. Beachten Sie, dass Sie den Ordner selbst erstellen müssen. Wenn Sie das nächste Mal darauf zurückkommen müssen, geben Sie einfach "scripts:" ein und drücken Sie die Eingabetaste, genau wie bei jedem Laufwerksbuchstaben in Windows.

$env:path += ";$profiledir\scripts"
New-PSDrive -Name Scripts -PSProvider FileSystem -Root $profiledir\scripts
halr9000
quelle
3

Dadurch werden Snapins hinzugefügt, die Sie in Ihrer Powershell-Sitzung installiert haben. Der Grund, warum Sie so etwas tun möchten, ist, dass es einfach zu warten ist und gut funktioniert, wenn Sie Ihr Profil über mehrere Systeme hinweg synchronisieren. Wenn kein Snapin installiert ist, wird keine Fehlermeldung angezeigt.

-------------------------------------------------- -------------------------

Fügen Sie Snapins von Drittanbietern hinzu

-------------------------------------------------- -------------------------

$snapins = @(
    "Quest.ActiveRoles.ADManagement",
    "PowerGadgets",
    "VMware.VimAutomation.Core",
    "NetCmdlets"
)
$snapins | ForEach-Object { 
  if ( Get-PSSnapin -Registered $_ -ErrorAction SilentlyContinue ) {
    Add-PSSnapin $_
  }
}
halr9000
quelle
3

Ich habe alle meine Funktionen und Aliase in separaten Skriptdateien abgelegt und sie dann in meinem Profil als Punktquelle gespeichert:

. c: \ scripts \ posh \ jdh-functions.ps1

Jeffery Hicks
quelle
2

Die Funktion zum Anzeigen des gesamten Verlaufs des eingegebenen Befehls (Get-History und sein Alias ​​h zeigen standardmäßig nur 32 letzte Befehle an):

function ha {
    Get-History -count $MaximumHistoryCount
}
Alex
quelle
2

Sie können mein PowerShell-Profil unter http://github.com/jamesottaway/windowspowershell sehen

Wenn Sie Git verwenden, um mein Repo in Ihren Ordner "Dokumente" zu klonen (oder in einen beliebigen Ordner, der sich in Ihrer Variablen "$ PROFILE" über "WindowsPowerShell" befindet), erhalten Sie all meine Güte.

Der Hauptordner profile.ps1legt den Unterordner mit dem Namen Addonsa fest PSDriveund findet dann alle .ps1-Dateien unter diesem Ordner zum Laden.

Ich mag den goBefehl sehr, der ein Wörterbuch mit Kurzschriftorten speichert, die leicht zu besuchen sind. Zum Beispiel go vspwerde ich zu nehmen C:\Visual Studio 2008\Projects.

Ich mag es auch, das Set-LocationCmdlet zu überschreiben, um sowohl Set-Locationals auch auszuführen Get-ChildItem.

Mein anderer Favorit ist es, etwas zu tun, mkdirwas Set-Location xyznach dem Laufen funktioniert New-Item xyz -Type Directory.

JMS
quelle
2
Function funcOpenPowerShellProfile
{
    Notepad $PROFILE
}

Set-Alias fop funcOpenPowerShellProfile

Nur eine scharfsinnig faule Person würde Ihnen sagen, dass das Tippenfop so viel einfacher ist als Notepad $PROFILEan der Eingabeaufforderung, es sei denn, Sie assoziieren "fop" natürlich mit einem englischen Ninny aus dem 17. Jahrhundert .


Wenn Sie möchten, können Sie noch einen Schritt weiter gehen und es nützlich machen:

Function funcOpenPowerShellProfile
{
    $fileProfileBackup = $PROFILE + '.bak'
    cp $PROFILE $fileProfileBackup
    PowerShell_ISE $PROFILE # Replace with Desired IDE/ISE for Syntax Highlighting
}

Set-Alias fop funcOpenPowerShellProfile

Für die Befriedigung der Survivalist-Paranoia:

Function funcOpenPowerShellProfile
{
    $fileProfilePathParts = @($PROFILE.Split('\'))
    $fileProfileName = $fileProfilePathParts[-1]
    $fileProfilePathPartNum = 0
    $fileProfileHostPath = $fileProfilePathParts[$fileProfilePathPartNum] + '\'
    $fileProfileHostPathPartsCount = $fileProfilePathParts.Count - 2
        # Arrays start at 0, but the Count starts at 1; if both started at 0 or 1, 
        # then a -1 would be fine, but the realized discrepancy is 2
    Do
    {
        $fileProfilePathPartNum++
        $fileProfileHostPath = $fileProfileHostPath + `
            $fileProfilePathParts[$fileProfilePathPartNum] + '\'
    }
    While
    (
        $fileProfilePathPartNum -LT $fileProfileHostPathPartsCount
    )
    $fileProfileBackupTime = [string](date -format u) -replace ":", ""
    $fileProfileBackup = $fileProfileHostPath + `
        $fileProfileBackupTime + ' - ' + $fileProfileName + '.bak'
    cp $PROFILE $fileProfileBackup

    cd $fileProfileHostPath
    $fileProfileBackupNamePattern = $fileProfileName + '.bak'
    $fileProfileBackups = @(ls | Where {$_.Name -Match $fileProfileBackupNamePattern} | `
        Sort Name)
    $fileProfileBackupsCount = $fileProfileBackups.Count
    $fileProfileBackupThreshold = 5 # Change as Desired
    If
    (
        $fileProfileBackupsCount -GT $fileProfileBackupThreshold
    )
    {
        $fileProfileBackupsDeleteNum = $fileProfileBackupsCount - `
            $fileProfileBackupThreshold
        $fileProfileBackupsIndexNum = 0
        Do
        {

            rm $fileProfileBackups[$fileProfileBackupsIndexNum]
            $fileProfileBackupsIndexNum++;
            $fileProfileBackupsDeleteNum--
        }
        While
        (
            $fileProfileBackupsDeleteNum -NE 0
        )
    }

    PowerShell_ISE $PROFILE
        # Replace 'PowerShell_ISE' with Desired IDE (IDE's path may be needed in 
        # '$Env:PATH' for this to work; if you can start it from the "Run" window, 
        # you should be fine)
}

Set-Alias fop funcOpenPowerShellProfile
Stisfa
quelle
2

unter vielen anderen Dingen:

function w {
    explorer .
}

öffnet ein Explorer-Fenster im aktuellen Verzeichnis

function startover {
    iisreset /restart
    iisreset /stop

    rm "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\*.*" -recurse -force -Verbose

    iisreset /start
}

wird alles in meinen temporären asp.net-Dateien los (nützlich für die Arbeit an verwaltetem Code, der Abhängigkeiten von fehlerhaftem, nicht verwaltetem Code aufweist)

function edit($x) {
    . 'C:\Program Files (x86)\Notepad++\notepad++.exe' $x
}

bearbeitet $ x in Notepad ++

Bill Barry
quelle
2

Ich halte meine tatsächlich auf Github .

Scott Muc
quelle
2

Jeffrey Snovers Start-NewScope, da das Neustarten der Shell ein Problem sein kann.

Ich habe mich nie mit den direkten Optionen vertraut gemacht , also :

function Get-FolderSizes {
  [cmdletBinding()]
  param(
    [parameter(mandatory=$true)]$Path,
    [parameter(mandatory=$false)]$SizeMB,
    [parameter(mandatory=$false)]$ExcludeFolder
  ) #close param
  $pathCheck = test-path $path
  if (!$pathcheck) {"Invalid path. Wants gci's -path parameter."; break}
  $fso = New-Object -ComObject scripting.filesystemobject
  $parents = Get-ChildItem $path -Force | where { $_.PSisContainer -and $_.name -ne $ExcludeFolder }
  $folders = Foreach ($folder in $parents) {
    $getFolder = $fso.getFolder( $folder.fullname.tostring() )
    if (!$getFolder.Size) { #for "special folders" like appdata
      $lengthSum = gci $folder.FullName -recurse -force -ea silentlyContinue | `
        measure -sum length -ea SilentlyContinue | select -expand sum
      $sizeMBs = "{0:N0}" -f ($lengthSum /1mb)      
    } #close if size property is null
      else { $sizeMBs = "{0:N0}" -f ($getFolder.size /1mb) }
      #else {$sizeMBs = [int]($getFolder.size /1mb) }
    New-Object -TypeName psobject -Property @{
       name = $getFolder.path;
      sizeMB = $sizeMBs
    } #close new obj property
  } #close foreach folder
  #here's the output
  $folders | sort @{E={[decimal]$_.sizeMB}} -Descending | ? {[decimal]$_.sizeMB -gt $SizeMB} | ft -auto
  #calculate the total including contents
  $sum = $folders | select -expand sizeMB | measure -sum | select -expand sum
  $sum += ( gci -file $path | measure -property length -sum | select -expand sum ) / 1mb
  $sumString = "{0:n2}" -f ($sum /1kb)
  $sumString + " GB total" 
} #end function
set-alias gfs Get-FolderSizes

Ebenso praktisch für die Betrachtung des Speicherplatzes:

function get-drivespace {
  param( [parameter(mandatory=$true)]$Computer)
  if ($computer -like "*.com") {$cred = get-credential; $qry = Get-WmiObject Win32_LogicalDisk -filter drivetype=3 -comp $computer -credential $cred }
  else { $qry = Get-WmiObject Win32_LogicalDisk -filter drivetype=3 -comp $computer }  
  $qry | select `
    @{n="drive"; e={$_.deviceID}}, `
    @{n="GB Free"; e={"{0:N2}" -f ($_.freespace / 1gb)}}, `
    @{n="TotalGB"; e={"{0:N0}" -f ($_.size / 1gb)}}, `
    @{n="FreePct"; e={"{0:P0}" -f ($_.FreeSpace / $_.size)}}, `
    @{n="name"; e={$_.volumeName}} |
  format-table -autosize
} #close drivespace

Für das Zeigen auf Sachen:

function New-URLfile {
  param( [parameter(mandatory=$true)]$Target, [parameter(mandatory=$true)]$Link )
  if ($target -match "^\." -or $link -match "^\.") {"Full paths plz."; break}
  $content = @()
  $header = '[InternetShortcut]'
  $content += $header
  $content += "URL=" + $target
  $content | out-file $link  
  ii $link
} #end function

function New-LNKFile {
  param( [parameter(mandatory=$true)]$Target, [parameter(mandatory=$true)]$Link )
  if ($target -match "^\." -or $link -match "^\.") {"Full paths plz."; break}
  $WshShell = New-Object -comObject WScript.Shell
  $Shortcut = $WshShell.CreateShortcut($link)
  $Shortcut.TargetPath = $target
  $shortCut.save()
} #end function new-lnkfile

Grep des armen Mannes? Zum Durchsuchen großer txt-Dateien.

function Search-TextFile {
  param( 
    [parameter(mandatory=$true)]$File,
    [parameter(mandatory=$true)]$SearchText
  ) #close param
  if ( !(test-path $File) ) {"File not found:" + $File; break}
  $fullPath = resolve-path $file | select -expand path
  $lines = [system.io.file]::ReadLines($fullPath)
  foreach ($line in $lines) { if ($line -match $SearchText) {$line} }
} #end function Search-TextFile

Listet Programme auf, die auf einem Remotecomputer installiert sind.

function Get-InstalledProgram { [cmdletBinding()] #http://blogs.technet.com/b/heyscriptingguy/archive/2011/11/13/use-powershell-to-quickly-find-installed-software.aspx
      param( [parameter(mandatory=$true)]$Comp,[parameter(mandatory=$false)]$Name )
      $keys = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
      TRY { $RegBase = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Comp) }
      CATCH {
        $rrSvc = gwmi win32_service -comp $comp -Filter {name='RemoteRegistry'}
        if (!$rrSvc) {"Unable to connect. Make sure that this computer is on the network, has remote administration enabled, `nand that both computers are running the remote registry service."; break}
        #Enable and start RemoteRegistry service
        if ($rrSvc.State -ne 'Running') {
          if ($rrSvc.StartMode -eq 'Disabled') { $null = $rrSvc.ChangeStartMode('Manual'); $undoMe2 = $true }
          $null = $rrSvc.StartService() ; $undoMe = $true       
        } #close if rrsvc not running
          else {"Unable to connect. Make sure that this computer is on the network, has remote administration enabled, `nand that both computers are running the remote registry service."; break}
        $RegBase = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Comp)  
      } #close if failed to connect regbase
      $out = @()
      foreach ($key in $keys) {
         if ( $RegBase.OpenSubKey($Key) ) { #avoids errors on 32bit OS
          foreach ( $entry in $RegBase.OpenSubKey($Key).GetSubkeyNames() ) {
            $sub = $RegBase.OpenSubKey( ($key + '\' + $entry) )
            if ($sub) { $row = $null
              $row = [pscustomobject]@{
                Name = $RegBase.OpenSubKey( ($key + '\' + $entry) ).GetValue('DisplayName')
                InstallDate = $RegBase.OpenSubKey( ($key + '\' + $entry) ).GetValue('InstallDate')
                Version = $RegBase.OpenSubKey( ($key + '\' + $entry) ).GetValue('DisplayVersion')
              } #close row
              $out += $row
            } #close if sub
          } #close foreach entry
        } #close if key exists
      } #close foreach key
      $out | where {$_.name -and $_.name -match $Name}
      if ($undoMe) { $null = $rrSvc.StopService() }
      if ($undoMe2) { $null = $rrSvc.ChangeStartMode('Disabled') }
    } #end function

Meta gehen, das Evangelium verbreiten, so weiter

function Copy-ProfilePS1 ($Comp,$User) {
  if (!$User) {$User = $env:USERNAME}
  $targ = "\\$comp\c$\users\$User\Documents\WindowsPowershell\"
  if (Test-Path $targ)
  {
    $cmd = "copy /-Y $profile $targ"
    cmd /c $cmd
  } else {"Path not found! $targ"}
} #end function CopyProfilePS1
noam
quelle
1
$MaximumHistoryCount=1024 
function hist {get-history -count 256 | %{$_.commandline}}

New-Alias which get-command

function guidConverter([byte[]] $gross){ $GUID = "{" + $gross[3].ToString("X2") + `
$gross[2].ToString("X2") + $gross[1].ToString("X2") + $gross[0].ToString("X2") + "-" + `
$gross[5].ToString("X2") + $gross[4].ToString("X2") + "-" + $gross[7].ToString("X2") + `
$gross[6].ToString("X2") + "-" + $gross[8].ToString("X2") + $gross[9].ToString("X2") + "-" +` 
$gross[10].ToString("X2") + $gross[11].ToString("X2") + $gross[12].ToString("X2") + `
$gross[13].ToString("X2") + $gross[14].ToString("X2") + $gross[15].ToString("X2") + "}" $GUID }
Slipsec
quelle
1

Ich halte mein Profil leer. Stattdessen habe ich Ordner mit Skripten, in denen ich navigieren kann, um Funktionen und Aliase in die Sitzung zu laden. Ein Ordner ist modular aufgebaut und enthält Bibliotheken mit Funktionen und Baugruppen. Für Ad-hoc-Arbeiten habe ich ein Skript zum Laden von Aliasnamen und Funktionen. Wenn ich Ereignisprotokolle munge möchte, würde ich zu einem Ordner scripts \ eventlogs navigieren und ausführen

PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1

Ich mache das, weil ich Skripte für andere freigeben oder von Maschine zu Maschine verschieben muss. Ich möchte in der Lage sein, einen Ordner mit Skripten und Assemblys zu kopieren und ihn für jeden Benutzer auf jedem Computer funktionieren zu lassen.

Aber du willst eine lustige Sammlung von Tricks. Hier ist ein Skript, von dem viele meiner "Profile" abhängen. Es ermöglicht Aufrufe von Webdiensten, die selbstsigniertes SSL für die Ad-hoc-Untersuchung von Webdiensten in der Entwicklung verwenden. Ja, ich mische C # frei in meinen Powershell-Skripten.

# Using a target web service that requires SSL, but server is self-signed.  
# Without this, we'll fail unable to establish trust relationship. 
function Set-CertificateValidationCallback
{
    try
    {
       Add-Type @'
    using System;

    public static class CertificateAcceptor{

        public static void SetAccept()
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = AcceptCertificate;
        }

        private static bool AcceptCertificate(Object sender,
                        System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors policyErrors)
            {
                Console.WriteLine("Accepting certificate and ignoring any SSL errors.");
                return true;
            }
    }
'@
    }
    catch {} # Already exists? Find a better way to check.

     [CertificateAcceptor]::SetAccept()
}
Niederschlagend
quelle
0

Gute Frage. Da ich mit mehreren verschiedenen PowerShell-Hosts zu tun habe, logge ich mich ein wenig in mehrere Profile ein, um den Kontext anderer Nachrichten klarer zu gestalten. In habe profile.ps1ich derzeit nur das, aber ich ändere es manchmal basierend auf dem Kontext:

if ($PSVersionTable.PsVersion.Major -ge 3) {
    Write-Host "Executing $PSCommandPath"
}

Mein Lieblingshost ist die ISE, in der Microsoft.PowerShellIse_profile.ps1ich habe:

if ($PSVersionTable.PsVersion.Major -ge 3) {
    Write-Host "Executing $PSCommandPath"
}

if ( New-PSDrive -ErrorAction Ignore One FileSystem `
        (Get-ItemProperty hkcu:\Software\Microsoft\SkyDrive UserFolder).UserFolder) { 
    Write-Host -ForegroundColor Green "PSDrive One: mapped to local OneDrive/SkyDrive folder"
    }

Import-Module PSCX

$PSCX:TextEditor = (get-command Powershell_ISE).Path

$PSDefaultParameterValues = @{
    "Get-Help:ShowWindow" = $true
    "Help:ShowWindow" = $true
    "Out-Default:OutVariable" = "0"
}


#Script Browser Begin
#Version: 1.2.1
Add-Type -Path 'C:\Program Files (x86)\Microsoft Corporation\Microsoft Script Browser\System.Windows.Interactivity.dll'
Add-Type -Path 'C:\Program Files (x86)\Microsoft Corporation\Microsoft Script Browser\ScriptBrowser.dll'
Add-Type -Path 'C:\Program Files (x86)\Microsoft Corporation\Microsoft Script Browser\BestPractices.dll'
$scriptBrowser = $psISE.CurrentPowerShellTab.VerticalAddOnTools.Add('Script Browser', [ScriptExplorer.Views.MainView], $true)
$scriptAnalyzer = $psISE.CurrentPowerShellTab.VerticalAddOnTools.Add('Script Analyzer', [BestPractices.Views.BestPracticesView], $true)
$psISE.CurrentPowerShellTab.VisibleVerticalAddOnTools.SelectedAddOnTool = $scriptBrowser
#Script Browser End
Burt_Harris
quelle