11 February 2013 Powershell, Visual Studio Robert Muehsig

Da ich in lezter Zeit immer häufiger auf die Powershell zugegriffen hab und es mich immer gestört hat, dass die Visual Studio Tools wie sn.exe oder msbuild.exe nur über die “Developer Command Prompt” aufrufbar waren (ohne den kompletten Pfad anzugeben) habe ich mal nach der Lösung gegoogelt.

Was macht die Developer Command Prompt?

imageDer Shortcut ruft eigentlich die Batch Datei “VsDevCmd.bat” auf, welche diverse Umgebungsvariablen setzt.

Die Datei ist unter diesem Pfad zu finden:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools

Ein Profile.ps1 anlegen

Um in jeder Powershell Session auf diese Funktionalität zuzugreifen kann man ein Profil anlegen. 

Dazu legt man einen “WindowsPowershell” Ordner hier an:

C:\Users\USERNAME\Documents

Im WindowsPowershell Ordner legt man eine Profile.ps1 Datei an. Diese wird ab sofort bei jeder Powershell Session automatisch ausgeführt

Visual Studio Tools in der Powershell registrieren (und noch mehr)

Durch ein Link von dem Stackoverflow Threads bin ich auf diesen Blog gekommen. Zudem habe ich noch ein paar Anregungen von Thomas Freudenberg übernommen, da er sein Powershell Profile hier veröffentlicht hat. Heraus gekommen ist dies:

###############################################################################
# Profile PS1 based on this samples:
# http://stackoverflow.com/questions/138144/whats-in-your-powershell-profile-ps1file
# http://www.tavaresstudios.com/Blog/post/The-last-vsvars32ps1-Ill-ever-need.aspx
# Place this file in: C:\Users\ACCNAME\Documents\WindowsPowerShell\profile.ps1
# https://gist.github.com/thoemmi/3720721
###############################################################################
# red background if running elevated
###############################################################################

& {
 $wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
 $prp=new-object System.Security.Principal.WindowsPrincipal($wid)
 $adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
 $IsAdmin=$prp.IsInRole($adm)
 if ($IsAdmin)
 {
  (get-host).UI.RawUI.Backgroundcolor="DarkRed"
  clear-host
 }
}

###############################################################################
# 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 (for VS 2012)
###############################################################################
function VsVars32($version = "11.0")
{
	# 64bit Key in Registry
    $theKey = "HKLM:SOFTWARE\Wow6432Node\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"

	Write-Host "[Profile.ps1] Visual Studio 2012 CMD Commands set" -Foreground Green
}

function SetupPowershellHistory() {
	$profileFolder = split-path $profile

	# save last 100 history items on exit
	$historyPath = Join-Path $profileFolder history.clixml

	# hook powershell's exiting event & hide the registration with -supportevent.
	Register-EngineEvent -SourceIdentifier powershell.exiting -SupportEvent -Action {
		Get-History -Count 100 | Export-Clixml (Join-Path (split-path $profile) history.clixml) }

	# load previous history, if it exists
	if ((Test-Path $historyPath)) {
		Import-Clixml $historyPath | ? {$count++;$true} | Add-History
		Write-Host "[Profile.ps1] Loaded $count history item(s)" -Foreground Green
	}
}

###############################################################################
# Execute
###############################################################################
Write-Host "[Custom Profile.ps1 invoked]"

# VS
VsVars32

# History
SetupPowershellHistory

Write-Host "[Custom Profile.ps1 finished]"

Damit habe ich in jeder Powershell Session die Visual Studio Tools dabei sowie die letzten 100 Befehle die ich eingetippt hab (was ziemlich cool ist).

image

Was ist der Unteschied zwischen Profile.ps1 und Microsoft.Powershell_Profile.ps1?

Wer nur ein “Profile.ps1” ablegt, der hat die Funktionalität in allen Powershell Hosts zur Verfügung – d.h. auch z.B. im NuGet Package Manager. Wer es nur von der Windows Powershell benötigt, der kann ein Microsoft.Powershell_profile.ps1 anlegen.

Sourcen

Das ganze ist natürlich auch auf GitHub zu finden. Wer noch Anregung hat, kann gern auch ein Pull Request machen ;)


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!