# encoding: ascii
# api: powershell
# title: profile.ps1
# description: Posting my profile.ps1 in case anyone is interested:
# version: 5.1.1
# type: module
# author: Tim Dunn
# license: CC0
# function: Set-DefaultPrompt
# x-poshcode-id: 6444
# x-archived: 2016-07-10T05:11:43
# x-published: 2016-07-08T20:59:00
#
#
#requires -Version 3
#$PSModuleAutoLoadingPreference = 'None'
#region module management
########################################
# $cloudDrivePath = $null # OneNote, GoogleDrive, DropBox, Carbonite, eieio...
[System.Collections.ArrayList]$Private:moduleList = @(
#"$cloudDrivePath\PSHModules\PSReadLine\PSReadline.psd1",
#"$cloudDrivePath\PSHModules\Add-on.CopyAsColorizedHTML\Add-on.CopyAsColorizedHTML.psd1",
# my function library
"$cloudDrivePath\PSHModules\Toolkit",
"$cloudDrivePath\PSHModules\Pester"
)
if ($Host.Name -match 'Ise Host')
{
$Private:moduleList += "$cloudDrivePath\PSHModules\ISESteroids"
}
$Private:moduleList| ForEach-Object -Process {
if (Test-Path -Path $_)
{
Import-Module -Force -Name $_
}
}
########################################
#endregion module management
#region $host.$env:USERNAME session state noteproperty
########################################
if (!$Host.$env:USERNAME)
{
Add-Member -InputObject $global:Host -MemberType NoteProperty -Name $env:USERNAME -Value @{} -Force
}
if ($Host.$env:USERNAME.IsAdministrator -eq $null)
{
$CurrentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$CurrentUserPrincipal = New-Object -TypeName Security.Principal.WindowsPrincipal -ArgumentList $CurrentUser
$AdminRole = [Security.Principal.WindowsBuiltinRole]::Administrator
$global:Host.$env:USERNAME.IsAdministrator = $CurrentUserPrincipal.IsInRole($AdminRole)
}
if (!($Private:userDomain = $env:USERDNSDOMAIN))
{
$Private:userDomain = $env:USERDOMAIN
}
$global:Host.$env:USERNAME.UserDomain = $Private:userDomain
$global:Host.$env:USERNAME.ComputerDomain = (Get-WmiObject -Class Win32_ComputerSystem).Domain
$global:Host.$env:USERNAME.Process = Get-Process -Id $pid
########################################
#endregion $host.$env:USERNAME session state noteproperty
#region ISE Preview management
# https://blogs.msdn.microsoft.com/powershell/2016/01/20/introducing-the-windows-powershell-ise-preview/
########################################
$private:staticIsePreviewreleasePath = 'C:\Program Files\WindowsPowerShell\Modules\PowerShellISE-preview\5.1.1\powershell_ise.exe'
if ($psISE.IsPreviewRelease)
{
if ($private:staticIsePreviewreleasePath -ne $Host.$env:USERNAME.Process.Path)
{
Write-Warning -Message 'Need to update outdated $private:staticIsePreviewreleasePath in'
Write-Warning -Message " $PSCommandPath from"
Write-Warning -Message " $private:staticIsePreviewreleasePath to "
Write-Warning -Message " $($Host.$env:USERNAME.Process.Path)"
}
$private:staticIsePreviewreleasePath = $Host.$env:USERNAME.Process.Path
}
if (Test-Path -Path $private:staticIsePreviewreleasePath)
{
# we want the path to persist, but not pollute the user's variable: PSDrive, so we embed it in a scriptblock
# type 'isep' to start the ISE-Preview
Set-Content -Path function:Start-IsePreviewRelease -Value ([scriptblock]::Create("Invoke-Item -Path '$private:staticIsePreviewreleasePath'"))
Set-Alias -Name isep -Value Start-IsePreviewRelease
}
########################################
#endregion ISE Preview management
#region function prompt {}
########################################
<#
Break the close-multiline-comment tag to un-collapse only this function#>
function prompt
{
[CmdletBinding()]
param (
[switch]$ForceWindowTitle
)
#region get PSH window data cached in $Host
########################################
$userDomain = $Host.$env:USERNAME.UserDomain
$ComputerDomain = $Host.$env:USERNAME.ComputerDomain
########################################
#endregion get PSH window data cached in $Host
#region get dynamic data
########################################
if ($Host.$env:USERNAME.IsAdministrator)
{
$windowTitleAdminString = 'Administrator: '
$promptAdminString = '#!#' # for the command prompt line
}
else
{
$windowTitleAdminString = $null
$promptAdminString = '#' # for the command prompt line
}
if ($history = Get-History | Select-Object -Last 1)
{
$lastCommandElapsedTime = ($history.EndExecutionTime - $history.StartExecutionTime).ToString() -replace '\..*'
}
else
{
$lastCommandElapsedTime = '00:00:00'
}
$historyId = [int]($history.Id) + 1
$now = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
$path = $ExecutionContext.SessionState.Path.CurrentLocation
########################################
#endregion get dynamic data
#region update the UI
########################################
# set the titlebar if it's default
if ($ForceWindowTitle -or $Host.UI.RawUI.WindowTitle -match 'Windows PowerShell$')
{
$Host.UI.RawUI.WindowTitle = "$windowTitleAdminString $path [$now]"
}
# set the prompt
"`n$promptAdminString $userDomain\$env:USERNAME @ $env:computerName.$ComputerDomain $lastCommandElapsedTime ($historyId)".ToLower() +
"`n$promptAdminString $path $now $('>' * $nestedPromptLevel)>`n"
########################################
#endregion update the UI
} #> # function prompt
<#
Break the close-multiline-comment tag to un-collapse only this function#>
function Set-DefaultPrompt
{
{
"PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
} | Set-Content -Path function:prompt
} #> # function Set-DefaultPrompt
<#
Break the close-multiline-comment tag to un-collapse only this function#>
function Set-SimplePrompt
{
{
"PS $($ExecutionContext.SessionState.Path.CurrentLocation) ($(1 + (Get-History | Select-Object -Last 1).Id)) $('>' * ($nestedPromptLevel + 1)) "
} | Set-Content -Path function:prompt
} #> # function Set-SimplePrompt
########################################
#endregion function prompt {}
#region catch-all
########################################
# $profile points to "$MyDocuments\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1" or '...\Microsoft.PowerShell_profile.ps1', but they're empty
# this is where all my setup code goes. Therefore, typing '. $profile' doesn't work for me. I type 'ip' to (re)load *this* file
Set-Content -Path function:Invoke-Profile -Value ([scriptblock]::Create(". '$PSCommandPath'"))
Set-Alias -Name ip -Value Invoke-Profile
########################################
#endregion catch-all
#region actual stuff to execute
########################################
# 'Open as Administrator' shells always start in c:\windows\system32, which is a Very Bad Idea
$sys32folder = $env:ComSpec -replace 'cmd\.exe$' -replace '\\', '\\'
if ((Get-Location).ProviderPath -match "^$sys32folder")
{
Set-Location -Path $HOME
}
$pshFso = Get-Item -Path $Host.$env:USERNAME.Process.Path
Write-Host -ForegroundColor Green -Object "$($pshFso.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss')) $($pshFso.FullName) $($Host.$env:USERNAME.Process.FileVersion)"
($PSCommandPath, $profile) |
Where-Object -FilterScript {
$_
} |
ForEach-Object -Process {
$fso = Get-Item -Path $_
Write-Host -ForegroundColor Green -Object "$($fso.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss')) $($fso.FullName)"
}
$error.Clear()
########################################
#endregion actual stuff to execute