什么是你的PowerShell`profile.ps1`文件?

你有什么基本的东西(function,别名,启动脚本),你有你的个人资料?

我经常发现自己需要一些基本的agregate来计算/总结一些东西,我定义了这些函数并经常使用它们,它们在stream水线的末端工作得非常好:

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

为了能够在提示中获得时间和颜色的path:

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

以下function从博客中被盗取,并被修改以适应我的口味,但ls的颜色非常好:

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

还有一些快捷键可以避免真正重复的过滤任务:

 # 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)) { $_ } } 

从PowerShell设置我的Visual Studio生成环境,我从这里拿走了VsVars32。 并一直使用它。

 ################################################## #############################
 #批量公开环境variables,并将其设置在此PS会话中
 ################################################## #############################
函数Get-Batchfile($文件) 
 {
     $ theCmd =“`”$ file`“&设置” 
     cmd / c $ theCmd |  Foreach-Object {
         $ thePath,$ theValue = $ _。split('=')
         Set-Item -path env:$ thePath -value $ theValue
     }
 }


 ################################################## #############################
 #设置此PS会话使用的VSvariables
 ################################################## #############################
函数VsVars32($ version =“9.0”)
 {
     $ theKey =“HKLM:SOFTWARE \ Microsoft \ VisualStudio \”+ $版本
     $ theVsKey = get-ItemProperty $ theKey
     $ theVsInstallPath = [System.IO.Path] :: GetDirectoryName($ theVsKey.InstallDir)
     $ theVsToolsDir = [System.IO.Path] :: GetDirectoryName($ theVsInstallPath)
     $ theVsToolsDir = [System.IO.Path] :: Combine($ theVsToolsDir,“工具”)
     $ theBatchFile = [System.IO.Path] :: Combine($ theVsToolsDir,“vsvars32.bat”)
     Get-Batchfile $ theBatchFile
     [System.Console] :: Title =“Visual Studio”+ $ version +“Windows Powershell”
 }

这遍历一个脚本PSDrive并点源以“lib-”开头的所有内容。

 ### --------------------------------------------------------------------------- ### Load function / filter definition library ### --------------------------------------------------------------------------- Get-ChildItem scripts:\lib-*.ps1 | % { . $_ write-host "Loading library file:`t$($_.name)" } 

开始 – 成绩单 。 这会将您的整个会话写入一个文本文件。 非常适合培训新员工如何在环境中使用Powershell。

我的提示包含:

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

这给我一个命令之间的分隔线,很容易看到滚动回来。 它还显示当前目录,而不使用我正在input的行上的水平空间。

例如:

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

这是我不那么微妙的configuration文件

 #============================================================================== # 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'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
#============================================================================== # 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'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 
 # ---------------------------------------------------------- # 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; } 

我很高兴这个线程存在,非常酷!

我摇了几个function,因为我是一个模块作者,我通常加载一个控制台,拼命地需要知道什么地方。

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

死心烦意乱

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

强制任何我可以powershell我将function去这里…

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

我仍然是一名pipe理员,所以我需要…

 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 } 

有时候,我想启动浏览器作为login用户以外的人…

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

这只是因为它的有趣。

 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 } 

我也有一个,因为WIN + L太远了..

 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 } 

几个filter? 我想是这样…

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

我还有一些我不能发布,因为他们没有完成,但他们基本上是一种持久性凭据之间的会话,而不写出它们作为encryption文件的方式。

中肯。

尽pipe我认为这已经被最近或即将发布的版本所取代。

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

我保留了一切。 大多数情况下,我的configuration文件设置了所有的环境(包括调用脚本来设置我的.NET / VS和Java开发环境)。

我还用我自己的风格重新定义了prompt()函数( 参见实际操作 ),为其他脚本和命令设置了多个别名。 并改变$HOME指向。

这是我完整的configuration文件脚本 。

我添加这个function,以便我可以很容易地看到磁盘使用情况:

 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") } } 
 Set-PSDebug -Strict 

你会受益我,你曾经search过一个愚蠢的错字例如。 输出$ varsometext而不是$ var sometext

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

对于使用xml非常有用,例如使用–xml的svn命令输出。

这将创build一个脚本:驱动器并将其添加到您的path。 请注意,您必须自己创build文件夹。 下一次你需要回到它,只需键入“脚本:”并按回车,就像在Windows中的任何驱动器号。

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

这将添加你已经安装到你的PowerShell会话中的pipe理单元。 你可能想要做这样的事情的原因是维护起来很容易,如果你在多个系统上同步你的configuration文件,效果很好。 如果没有安装pipe理单元,则不会看到错误消息。

————————————————– ————————-

添加第三方pipe理单元

————————————————– ————————-

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

我把我所有的函数和别名放在单独的脚本文件中,然后在我的configuration文件中将它们点出来:

。 C:\脚本\豪华\ JDH-functions.ps1

查看input命令的全部历史logging(Get-History和他的别名h显示默认只有32个最后的命令)的function:

 function ha { Get-History -count $MaximumHistoryCount } 

你可以在http://github.com/jamesottaway/windowspowershell看到我的PowerShellconfiguration文件;

如果你使用Git把我的repo克隆到你的Documents文件夹(或者你的$ PROFILEvariables中的'WindowsPowerShell'之上的任何文件夹),你将会得到我所有的好处。

profile.ps1将名为Addons的子文件夹设置为PSDrive ,然后查找要加载的文件夹下的所有.ps1文件。

我非常喜欢go命令,它存储了一个速记位置字典,可以轻松访问。 例如, go vsp会带我到C:\Visual Studio 2008\Projects

我也喜欢覆盖Set-Location cmdlet来运行Set-LocationGet-ChildItem

我的另一个最喜欢的是能够做一个mkdir ,运行New-Item xyz -Type Directory后,执行Set-Location xyz

我实际上保持我的github 。

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

我保持我的个人资料为空。 相反,我有我可以导航的脚本文件夹来加载会话的function和别名。 一个文件夹将是模块化的,具有函数和程序集库。 对于临时工作,我将有一个脚本来加载别名和函数。 如果我想要事件日志,我会导航到一个文件夹scripts \ eventlogs并执行

 PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1 

我这样做是因为我需要与他人共享脚本或将他们从机器移动到机器。 我喜欢能够复制一个脚本和程序集的文件夹,并让它在任何用户的任何机器上工作。

但是你想要一个有趣的收集技巧。 这是一个脚本,我的许多“configuration文件”依赖。 它允许调用使用自签名SSL的Web服务来临时探索开发中的Web服务。 是的,我可以在PowerShell脚本中自由混合使用C#。

 # 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() } 
 Function funcOpenPowerShellProfile { Notepad $PROFILE } Set-Alias fop funcOpenPowerShellProfile 

只有一个聪明懒惰的人会告诉你,在提示符下, fopNotepad $PROFILE更容易input,除非你把“fop”与17世纪的英文ninny联系起来 。


如果你想要的话,你可以进一步做一些有用的事情:

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

为了满足生存主义偏执狂:

 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 

其中包括:

 function w { explorer . } 

在当前目录中打开一个资源pipe理器窗口

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

摆脱我临时的asp.net文件中的所有内容(对于处理有bug的非托pipe代码依赖的托pipe代码很有用)

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

在记事本++编辑$ x

Jeffrey Snover的Start-NewScope,因为重新启动shell可能是一个阻力。

我从来不喜欢Diruse选项, 所以 :

 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 

同样方便查看磁盘空间:

 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? 用于search大的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 

伟大的问题。 Because I deal with several different PowerShell hosts, I do a little logging in each of several profiles, just to make the context of any other messages clearer. In profile.ps1 , I currently only have that, but I sometimes change it based on context:

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

My favorite host is the ISE, in Microsoft.PowerShellIse_profile.ps1 , I have:

 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 

Of everything not already listed, Start-Steroids has to be my favorite, except for maybe Start-Transcript.

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