Que contient votre fichier PowerShell `profile.ps1`? [fermé]

85

Quels éléments essentiels (fonctions, alias, scripts de démarrage) avez-vous dans votre profil?

Dakota du Sud
la source

Réponses:

23

Je me retrouve souvent à avoir besoin d'agrégats de base pour compter / additionner certaines choses., J'ai défini ces fonctions et les utilise souvent, elles fonctionnent très bien à la fin d'un 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 }
}

Pour pouvoir obtenir le temps et le chemin avec les couleurs dans mon invite:

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 "> "
}

Les fonctions suivantes sont volées sur un blog et modifiées à mon goût, mais ls avec des couleurs est très sympa:

# 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 }

Et quelques raccourcis pour éviter les tâches de filtrage vraiment répétitives:

# 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 Supercoptère
la source
2
Ce commentaire n'ajoute aucune valeur, mais je veux juste dire que votre nom d'utilisateur est génial.
chrisf
N'y a-t-il pas un problème de portée? Toutes les fonctions (ou alias) définies dans un script, y compris un script PowerShell, ne sont-elles pas limitées à l'exécution du script et s'évaporent sur le shell appelant? C'est le cas sur ma machine. Que devrais-je faire?
Uri
10

Pour configurer mon environnement de génération Visual Studio à partir de PowerShell, j'ai pris le VsVars32 à partir d' ici . et utilisez-le tout le temps.

################################################ ############################
# Expose les variables d'environnement dans un lot et les définit dans cette session PS
################################################ ############################
fonction Get-Batchfile ($ fichier) 
{
    $ theCmd = "` "$ fichier`" & set " 
    cmd / c $ theCmd | Foreach-Object {
        $ thePath, $ theValue = $ _. split ('=')
        Set-Item -path env: $ thePath -value $ theValue
    }
}


################################################ ############################
# Définit les variables VS pour cette session PS à utiliser
################################################ ############################
fonction 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
la source
1
j'utilise leeholmes.com/blog/ ... pour invoquer vcvars.
Jay Bazuzi
Le script ci-dessus ne fonctionne pas sous Windows 64 bits (en raison de la redirection du registre WOW64).
Govert
Dans ce cas, exécutez-le simplement dans le shell cmd.exe 32 bits WOW64. N'était-ce pas possible?
djangofan
10

Cela itère à travers un script PSDrive et dot-sources tout ce qui commence par "lib-".

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

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

start-transcript . Cela écrira toute votre session dans un fichier texte. Idéal pour former les nouveaux employés à l'utilisation de Powershell dans l'environnement.

jwmiller5
la source
2
+1 Merci pour le conseil ... Cela vient de résoudre mon problème avec la journalisation d'une construction d'intégration continue à la fois dans la console et dans un fichier journal. Je suis déçu que cela n'ait pas été bien documenté dans "Windows PowerShell pocket reference" ou "Windows PowerShell in Action". Je suppose que c'est quelque chose que vous apprenez de la pratique.
Peter Walke
À titre d'information, la commande Start-Transcript n'est pas disponible dans tous les hôtes PowerShell, donc la placer dans un profil indépendant de l'hôte (profile.ps1) peut générer des erreurs dans certains contextes. Cela peut être utile dans les profils spécifiques à l'hôte comme (Microsoft.PowerShellISE_profile.ps1).
Burt_Harris
9

Mon invite contient:

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

Ce qui me donne un séparateur entre les commandes qui est facile à voir lors du défilement vers l'arrière. Il me montre également le répertoire actuel sans utiliser d'espace horizontal sur la ligne sur laquelle je tape.

Par exemple:

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

Jay Bazuzi
la source
7

Voici mon profil pas si subtil


    #==============================================================================
# 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
la source
Où copier le profile.ps1? Est-il nécessaire de redémarrer la machine pour redémarrer le service winrm?
Kiquenet
@Kiquenet, redémarrez simplement votre session PowerShell.
Christopher Douglas
+1, très bien segmenté. Merci.
Sabuncu
7

Je bascule quelques fonctions, et comme je suis un auteur de module, je charge généralement une console et j'ai désespérément besoin de savoir où et où.

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

Mourir dur 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> "
}

Les fonctions obligatoires de tout ce que je peux PowerShell I vont ici ...

# 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)
}

Je suis TOUJOURS administrateur donc j'ai besoin ...

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
}

Parfois, je veux démarrer l'explorateur en tant que personne autre que l'utilisateur connecté ...

# 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
}

C'est juste parce que c'est drôle.

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
}

J'en ai aussi un pour moi, car Win+ Lc'est trop loin ...

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
}

Quelques filtres? Je le pense...

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

J'en ai également quelques-uns que je ne peux pas encore publier, car ils ne sont pas terminés, mais ils constituent essentiellement un moyen de conserver les informations d'identification entre les sessions sans les écrire sous forme de fichier crypté.

Christopher Douglas
la source
Nice stuff ici, je serais intéressé par votre solution pour les informations d'identification persistantes entre les sessions sans les écrire dans un fichier.
jkdba
@jkdba s'avère que je les ai écrits dans un fichier, le problème est que seule ma session peut déchiffrer le fichier et uniquement sur mon ordinateur. Essayez-le et faites-moi savoir si cela fonctionne pour vous.
Christopher Douglas
1
Hmm Intéressant, j'ai joué avec essentiellement la même idée, mais ce que j'ai fait à la place, c'est d'utiliser une base de données Keepass, puis de configurer mon profil pour ouvrir une connexion à la base de données et récupérer mes informations d'identification en tant que chaîne sécurisée et créer un objet d'identification . J'ai travaillé sur un wrapper de code keepass chic pour leur sdk, vous pouvez le trouver sur git avec mon nom d'utilisateur, repo appelé PSKeePass (consultez la branche de développement à partir de maintenant.) Il pourrait être facilement étendu pour utiliser une connexion réseau et un fichier de clés pour sécurité supplémentaire mais facile pour obtenir un effet similaire à ce que vous faites.
jkdba le
@jkdba c'est génial! Je vais certainement vérifier votre code et contribuer si je le peux. Je suis un grand fan de keepass, mais je n'ai jamais eu l'occasion d'utiliser leur SDK avec PS. Merci!
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
la source
2
Au lieu de Open-IEcela, j'utilise l' iialias intégré pour Invoke-Item.
Jay Bazuzi
1
ii " google.com " ne fonctionne pas. Comment l'utilisez-vous Jay?
Kevin Berridge
Essayezstart http://google.com
orad
5

J'ajoute cette fonction afin de pouvoir voir facilement l'utilisation du disque:

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
la source
5

à propos.

Bien que je pense que cela a été remplacé par une version récente ou à venir.

############################################################################## 
## 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
la source
Oui, Get-Help recherche désormais le contenu de la rubrique.
Keith Hill
5

Je garde un peu de tout. Surtout, mon profil configure tout l'environnement (y compris les scripts d'appel pour configurer mon environnement de développement .NET / VS et Java).

J'ai également redéfini la prompt()fonction avec mon propre style (le voir en action ), mis en place plusieurs alias vers d'autres scripts et commandes. et changer quoi$HOME pointe vers.

Voici mon script de profil complet .

Tomasr
la source
4
Set-PSDebug -Strict 

Vous bénéficierez si vous avez déjà recherché une stupide typo, par exemple. sortie de $ varsometext à la place de $ var someext

icnivad
la source
Je fais régulièrement des erreurs de type o. C'est très humiliant de réaliser que le code que vous venez de changer environ 12 fois fonctionne dans chaque sens, mais vous ne pouvez toujours pas épeler correctement le nom de la propriété.
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()
}

Utile pour travailler avec xml, comme la sortie des commandes svn avec --xml.

Ed Guiness
la source
3

Cela crée un script: drive et l'ajoute à votre chemin. Notez que vous devez créer le dossier vous-même. La prochaine fois que vous aurez besoin d'y revenir, tapez simplement "scripts:" et appuyez sur Entrée, comme n'importe quelle lettre de lecteur dans Windows.

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

Cela ajoutera des composants logiciels enfichables que vous avez installés dans votre session PowerShell. La raison pour laquelle vous voudrez peut-être faire quelque chose comme ceci est qu'elle est facile à maintenir et fonctionne bien si vous synchronisez votre profil sur plusieurs systèmes. Si un composant logiciel enfichable n'est pas installé, vous ne verrez pas de message d'erreur.

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

Ajouter des composants logiciels enfichables tiers

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

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

Je mets toutes mes fonctions et alias dans des fichiers de script séparés, puis je les trouve dans mon profil:

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

Jeffery Hicks
la source
2

La fonction pour afficher l'historique complet de la commande tapée (Get-History, et son alias ne montrent par défaut que les 32 dernières commandes):

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

Vous pouvez voir mon profil PowerShell sur http://github.com/jamesottaway/windowspowershell

Si vous utilisez Git pour cloner mon dépôt dans votre dossier Documents (ou tout autre dossier au-dessus de «WindowsPowerShell» dans votre variable $ PROFILE), vous obtiendrez tout mon bien.

Le principal profile.ps1définit le sous-dossier avec le nom Addonscomme a PSDrive, puis trouve tous les fichiers .ps1 sous ce dossier à charger.

J'aime assez la gocommande, qui stocke un dictionnaire de localisations abrégées à visiter facilement. Par exemple, go vspme conduira à C:\Visual Studio 2008\Projects.

J'aime aussi remplacer l' Set-Locationapplet de commande pour exécuter à la fois Set-Locationet Get-ChildItem.

Mon autre préféré est de pouvoir faire ce mkdirqui le fait Set-Location xyzaprès avoir couru New-Item xyz -Type Directory.

JMS
la source
2
Function funcOpenPowerShellProfile
{
    Notepad $PROFILE
}

Set-Alias fop funcOpenPowerShellProfile

Seul un individu sagacement paresseux vous dirait que fopc'est tellement plus facile à taper qu'à Notepad $PROFILEl'invite, à moins, bien sûr, que vous associez «fop» à un ninny anglais du 17ème siècle .


Si vous le souhaitez, vous pouvez aller plus loin et le rendre quelque peu utile:

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

Set-Alias fop funcOpenPowerShellProfile

Pour satisfaire la paranoïa de survie:

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
la source
2

entre autres:

function w {
    explorer .
}

ouvre une fenêtre d'explorateur dans le répertoire courant

function startover {
    iisreset /restart
    iisreset /stop

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

    iisreset /start
}

se débarrasse de tout dans mes fichiers asp.net temporaires (utile pour travailler sur du code géré qui a des dépendances sur du code non géré bogué)

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

édite $ x dans le bloc-notes ++

Bill Barry
la source
2

Start-NewScope de Jeffrey Snover car le redémarrage du shell peut être un glissement.

Je ne me suis jamais senti à l'aise avec les options de diruse , donc :

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

De même pratique pour regarder l'espace disque:

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

Pour pointer des choses:

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 du pauvre homme? Pour rechercher de gros fichiers txt.

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

Répertorie les programmes installés sur un ordinateur distant.

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

Aller méta, répandre l'évangile, quoi de neuf

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
la source
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
la source
1

Je garde mon profil vide. Au lieu de cela, j'ai des dossiers de scripts dans lesquels je peux naviguer pour charger des fonctionnalités et des alias dans la session. Un dossier sera modulaire, avec des bibliothèques de fonctions et d'assemblages. Pour le travail ad hoc, j'aurai un script pour charger les alias et les fonctions. Si je veux fusionner les journaux d'événements, je naviguerais vers un dossier scripts \ eventlogs et exécuterais

PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1

Je fais cela parce que j'ai besoin de partager des scripts avec d'autres ou de les déplacer d'une machine à l'autre. J'aime pouvoir copier un dossier de scripts et d'assemblages et le faire fonctionner sur n'importe quelle machine pour n'importe quel utilisateur.

Mais vous voulez une collection amusante de trucs. Voici un script dont dépendent beaucoup de mes "profils". Il permet d'appeler des services Web qui utilisent SSL auto-signé pour une exploration ad hoc des services Web en développement. Oui, je mélange librement C # dans mes scripts PowerShell.

# 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()
}
Abrupt
la source
0

Excellente question. Étant donné que je traite avec plusieurs hôtes PowerShell différents, je me connecte un peu dans chacun de plusieurs profils, juste pour clarifier le contexte de tous les autres messages. Dans profile.ps1, je n'ai actuellement que cela, mais je le change parfois en fonction du contexte:

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

Mon hôte préféré est l'ISE, en Microsoft.PowerShellIse_profile.ps1, j'ai:

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
la source