What is in the PowerShell file `profile.ps1`?

What are the essential things (functions, aliases, startup scripts) you have in your profile?

+73
powershell
Sep 26 '08 at 7:28
source share
26 answers

I often need to need some basic agents to count / summarize some things. I defined these functions and used them often; they work fine at the end of the 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 } } 

To get time and path with flowers in my tooltip:

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

The following features are stolen from the blog and changed according to my taste, but ls with colors is very nice:

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

And some shortcuts to avoid really repetitive filtering tasks:

 # 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)) { $_ } } 
+16
Jan 03 '09 at 17:10
source share

To set up the Visual Studio build environment from PowerShell, I took VsVars32 from here . and use it all the time.

 ######################################################## ################################
 #Exposes the environment vars in a batch and sets them in this PS session
 ####################################################### ################################
 function Get-Batchfile ($ file) 
 {
     $ theCmd = "` `" $ file` "& set" 
     cmd / c $ theCmd |  Foreach-Object {
         $ thePath, $ theValue = $ _. split ('=')
         Set-Item -path env: $ thePath -value $ theValue
     }
 }


 ####################################################### ################################
 # Sets the VS variables for this PS session to use
 ####################################################### ################################
 function 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"
 }
+10
Sep 26 '08 at 14:50
source share

This iterates through the PSDrive and dot-sources scripts everything that starts with "lib -".

 ### --------------------------------------------------------------------------- ### Load function / filter definition library ### --------------------------------------------------------------------------- Get-ChildItem scripts:\lib-*.ps1 | % { . $_ write-host "Loading library file:`t$($_.name)" } 
+10
Sep 28 '08 at 10:50
source share

start transcript . This will output your entire session to a text file. Great for educating new employees to use Powershell in an environment.

+8
Oct 22 '08 at 20:18
source share

My invitation contains:

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

Which gives me a divider between the teams, which are easy to see when scrolling back. It also shows me the current directory without using the horizontal space on the line on which I am printing.

For example:

 C: \ Users \ Jay -------------------------------------------- -------------------------------------------------- ------------
 [1] PS>
+8
Dec 26 '08 at 19:48
source share

Here is my not-so-thin profile

 #============================================================================== # Jared Parsons PowerShell Profile (jaredp@rantpack.org) #============================================================================== #============================================================================== # 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 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 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
#============================================================================== # Jared Parsons PowerShell Profile (jaredp@rantpack.org) #============================================================================== #============================================================================== # 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 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 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 
+7
01 Oct '08 at 17:35
source share
 # ---------------------------------------------------------- # 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; } 
+6
Sep 28 '08 at 14:02
source share

I am glad that this topic exists, very cool!

I download several functions, since I am the author of the module, I usually load the console and desperately need to know what's there.

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

Strength reinforcement

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

mandatory everything that I can use, I will perform the functions here ...

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

I am an ALL administrator, so I need ...

 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 } 

Sometimes I want to run explorer as someone other than a registered user ...

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

It’s just because it’s funny.

 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 } 

I also have one for me, since WIN + L is too far away.

 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 } 

A few filters? I think so...

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

I also have a few messages that I cannot do because they are not finished, but they are basically a way to save credentials between sessions without writing them as an encrypted file.

+6
Mar 29
source share

by the way.

Although I think this has been superseded by a recent or upcoming release.

 ############################################################################## ## 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 } } } 
+5
Sep 26 '08 at 8:03
source share

I hold a little bit of everything. Basically, my profile sets up the whole environment (including script calls to set up the .NET / VS and Java development environment).

I also redefine the prompt() function with my own style ( see it in action ), configure several aliases for other scripts and commands. and change what $HOME points to.

Here is my full profile script .

+5
Sep 28 '08 at 13:55
source share

i add this function so that I can easily see the disk usage:

 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") } } 
+4
Dec 22 '08 at 7:22
source share
 Set-PSDebug -Strict 

You will benefit from the fact that you have ever looked for a stupid Typo, for example. the output of $ varsometext instead of $ var sometext

+4
Dec 16 '09 at 8:40
source share
 ############################################################################## # 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() } 

Useful for working with xml, such as outputting svn commands with -xml.

+3
Sep 26 '08 at 8:02
source share

This creates a scenario: a disk and adds it to your path. Please note: you must create the folder yourself. Next time you need to go back to it, just type "scripts:" and press enter, just like any drive letter in Windows.

 $env:path += ";$profiledir\scripts" New-PSDrive -Name Scripts -PSProvider FileSystem -Root $profiledir\scripts 
+3
Sep 28 '08 at 22:53
source share

This will add the snapins that you installed in your powershell session. The reason you can do something like this is because it is easy to maintain and works well if you synchronize your profile across multiple systems. If snapin is not installed, you will not see an error message.

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

Adding third-party snapins

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

 $snapins = @( "Quest.ActiveRoles.ADManagement", "PowerGadgets", "VMware.VimAutomation.Core", "NetCmdlets" ) $snapins | ForEach-Object { if ( Get-PSSnapin -Registered $_ -ErrorAction SilentlyContinue ) { Add-PSSnapin $_ } } 
+3
Sep 28 '08 at 22:57
source share

I put all my functions and aliases into separate script files, and then their source points in my profile:

. C: \ Scripts \ Chic \ JDH-functions.ps1

+3
Oct 06 '08 at 15:12
source share

The function of viewing the entire history of a typed command (Get-History and its alias h show only the last 32 commands by default):

 function ha { Get-History -count $MaximumHistoryCount } 
+2
Nov 01 '08 at 16:00
source share

You can see my PowerShell profile at http://github.com/jamesottaway/windowspowershell

If you use Git to clone my repo into the Documents folder (or any folder is above the "WindowsPowerShell" in the $ PROFILE variable), you will get all my kindness.

The main profile.ps1 sets up a subfolder named Addons as PSDrive , and then finds all the .ps1 files under this download folder.

I really like the go command, which makes it easy to find a dictionary of shortened places. For example, go vsp will lead me to C:\Visual Studio 2008\Projects .

I also like to override the Set-Location cmdlet to run both Set-Location and Get-ChildItem .

My other favorite is to do mkdir , which runs Set-Location xyz after running New-Item xyz -Type Directory .

+2
Feb 03 '10 at 11:23
source share

I really stay on github .

+2
Jul 31 2018-11-11T00
source share
 $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 } 
+1
Sep 26 '08 at 12:27
source share

I leave my profile blank. Instead, I have script folders in which I can go on to load functions and aliases into the session. The folder will be modular, with libraries of functions and assemblies. For ad hoc to work, I will have a script to load aliases and functions. If I want to create event logs, I would go to the scripts \ eventlogs folder and execute

 PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1 

I do this because I need to share scripts with others or transfer them from machine to machine. I like to copy the folder with scripts and assemblies and work with it on any computer for any user.

But you need an interesting collection of tricks. Here's a script that many of my "profiles" depend on. It allows you to call web services that use self-signed SSL for special intelligence of web services in the development process. Yes, I freely mix C # in my powershell scripts.

 # 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() } 
+1
Sep 16 '09 at 21:15
source share
 Function funcOpenPowerShellProfile { Notepad $PROFILE } Set-Alias fop funcOpenPowerShellProfile 

Only a shrewdly lazy individual would tell you that fop much easier to type than Notepad $PROFILE in the tooltip, unless of course you associate "fop" with 17th century English ninny .




If you would like, you could take another step and make it somewhat useful:

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



To satisfy paranoia survival:

 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 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 
+1
Oct 05 2018-11-11T00:
source share

among many other things:

 function w { explorer . } 

opens explorer window in current directory

 function startover { iisreset /restart iisreset /stop rm "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\*.*" -recurse -force -Verbose iisreset /start } 

gets rid of everything in my asp.net temporary files (useful for working with managed code, which has dependencies on unmanaged unmanaged code)

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

edits $ x in notepad ++

+1
Apr 26 '12 at 16:05
source share

Jeffrey Snover Start-NewScope because restarting the shell can be drag and drop.

I never liked the diruse , so options:

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

It is also convenient to search for disk space:

 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 

:

 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? 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 

, .

 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 

, , - .

 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 
+1
06 . '14 23:03
source share

. PowerShell, , . profile.ps1 , :

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

- ISE, Microsoft.PowerShellIse_profile.ps1 :

 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 
0
21 . '14 17:46
source share

, , Start-Steroids , , , Start-Transcript.

( http://www.powertheshell.com/isesteroids2-2/ )

0
14 . '16 22:11
source share



All Articles