A menudo me encuentro necesitando algunos agregados básicos para contar / sumar algunas cosas. He definido estas funciones y las uso a menudo, funcionan muy bien al final de una canalización:
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 }
}
Para poder obtener el tiempo y la ruta con colores en mi mensaje:
function Get-Time { return $(get-date | foreach { $_.ToLongTimeString() } ) }
function prompt
{
write-host "[" -noNewLine
write-host $(Get-Time) -foreground yellow -noNewLine
write-host "] " -noNewLine
write-host $($(Get-Location).Path.replace($home,"~").replace("\","/")) -foreground green -noNewLine
write-host $(if ($nestedpromptlevel -ge 1) { '>>' }) -noNewLine
return "> "
}
Las siguientes funciones son robadas de un blog y modificadas para adaptarse a mi gusto, pero ls with colors es muy agradable:
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 }
Y algunos atajos para evitar tareas de filtrado realmente repetitivas:
filter match( $reg )
{
if ($_.tostring() -match $reg)
{ $_ }
}
filter exclude( $reg )
{
if (-not ($_.tostring() -match $reg))
{ $_ }
}
filter like( $glob )
{
if ($_.toString() -like $glob)
{ $_ }
}
filter unlike( $glob )
{
if (-not ($_.tostring() -like $glob))
{ $_ }
}
Para configurar mi entorno de compilación de Visual Studio desde PowerShell, tomé VsVars32 desde aquí . y utilícelo todo el tiempo.
fuente
Esto itera a través de un PSDrive scripts y dot-sources todo lo que comienza con "lib-".
### --------------------------------------------------------------------------- ### Load function / filter definition library ### --------------------------------------------------------------------------- Get-ChildItem scripts:\lib-*.ps1 | % { . $_ write-host "Loading library file:`t$($_.name)" }
fuente
start-transcript . Esto escribirá toda su sesión en un archivo de texto. Excelente para capacitar a los nuevos empleados sobre cómo usar Powershell en el medio ambiente.
fuente
Mi mensaje contiene:
$width = ($Host.UI.RawUI.WindowSize.Width - 2 - $(Get-Location).ToString().Length) $hr = New-Object System.String @('-',$width) Write-Host -ForegroundColor Red $(Get-Location) $hr
Lo que me da un divisor entre los comandos que es fácil de ver cuando me desplazo hacia atrás. También me muestra el directorio actual sin usar espacio horizontal en la línea en la que estoy escribiendo.
Por ejemplo:
fuente
Aquí está mi perfil no tan sutil
#============================================================================== # 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
fuente
Utilizo algunas funciones y, como soy autor de un módulo, normalmente cargo una consola y necesito desesperadamente saber dónde está.
write-host "Your modules are..." -ForegroundColor Red Get-module -li
Muere nerding duro:
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> " }
Las funciones obligatorias de PowerShell I will go here ...
# 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) }
TODAVÍA soy administrador, así que necesito ...
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 }
A veces quiero iniciar el explorador como alguien que no sea el usuario que inició sesión ...
# 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 }
Esto es solo porque es divertido.
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 }
También tengo uno para mí, ya que Win+ Lestá demasiado lejos ...
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 }
¿Algunos filtros? Creo que sí...
filter FileSizeBelow($size){if($_.length -le $size){ $_ }} filter FileSizeAbove($size){if($_.Length -ge $size){$_}}
También tengo algunas que no puedo publicar todavía, porque no están listas, pero son básicamente una forma de conservar las credenciales entre sesiones sin escribirlas como un archivo encriptado.
fuente
# ---------------------------------------------------------- # 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; }
fuente
Open-IE
usar elii
alias integrado paraInvoke-Item
.start http://google.com
agrego esta función para poder ver el uso del disco fácilmente:
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") } }
fuente
a propósito.
Aunque creo que esto ha sido reemplazado por un lanzamiento reciente o próximo.
############################################################################## ## 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 } } }
fuente
Guardo un poco de todo. Principalmente, mi perfil configura todo el entorno (incluidas las secuencias de comandos de llamada para configurar mi entorno de desarrollo .NET / VS y Java).
También redefiní la
prompt()
función con mi propio estilo (lo veo en acción ), configuro varios alias para otros scripts y comandos. y cambiar lo que$HOME
apunta.Aquí está mi guión de perfil completo .
fuente
Te beneficiarás si alguna vez has buscado un error tipográfico estúpido, por ejemplo. emitiendo $ varsometext en lugar de $ var sometext
fuente
############################################################################## # 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() }
Útil para trabajar con xml, como la salida de comandos svn con --xml.
fuente
Esto crea un script: drive y lo agrega a su ruta. Tenga en cuenta que debe crear la carpeta usted mismo. La próxima vez que necesite volver, simplemente escriba "scripts:" y presione enter, como cualquier letra de unidad en Windows.
$env:path += ";$profiledir\scripts" New-PSDrive -Name Scripts -PSProvider FileSystem -Root $profiledir\scripts
fuente
Esto agregará complementos que haya instalado en su sesión de PowerShell. La razón por la que puede querer hacer algo como esto es que es fácil de mantener y funciona bien si sincroniza su perfil en varios sistemas. Si no está instalado un complemento, no verá un mensaje de error.
-------------------------------------------------- -------------------------
Agregar complementos de terceros
-------------------------------------------------- -------------------------
$snapins = @( "Quest.ActiveRoles.ADManagement", "PowerGadgets", "VMware.VimAutomation.Core", "NetCmdlets" ) $snapins | ForEach-Object { if ( Get-PSSnapin -Registered $_ -ErrorAction SilentlyContinue ) { Add-PSSnapin $_ } }
fuente
Pongo todas mis funciones y alias en archivos de script separados y luego los coloco en mi perfil:
. c: \ scripts \ posh \ jdh-functions.ps1
fuente
La función para ver el historial completo del comando escrito (Get-History y su alias h muestran por defecto solo 32 últimos comandos):
function ha { Get-History -count $MaximumHistoryCount }
fuente
Puede ver mi perfil de PowerShell en http://github.com/jamesottaway/windowspowershell
Si usa Git para clonar mi repositorio en su carpeta Documentos (o cualquier carpeta que esté encima de 'WindowsPowerShell' en su variable $ PROFILE), obtendrá todas mis bondades.
El principal
profile.ps1
establece la subcarpeta con el nombreAddons
como aPSDrive
, y luego encuentra todos los archivos .ps1 debajo de esa carpeta para cargar.Me gusta bastante el
go
comando, que almacena un diccionario de ubicaciones abreviadas para visitar fácilmente. Por ejemplo,go vsp
me llevará aC:\Visual Studio 2008\Projects
.También me gusta anular el
Set-Location
cmdlet para ejecutar tantoSet-Location
yGet-ChildItem
.Mi otro favorito es poder hacer lo
mkdir
que haceSet-Location xyz
después de correrNew-Item xyz -Type Directory
.fuente
Function funcOpenPowerShellProfile { Notepad $PROFILE } Set-Alias fop funcOpenPowerShellProfile
Sólo una persona sagazmente perezosa le diría que
fop
es mucho más fácil escribir queNotepad $PROFILE
en el indicador, a menos que, por supuesto, asocie "fop" con un tonto inglés del siglo XVII .Si lo desea, puede dar un paso más y hacerlo algo útil:
Function funcOpenPowerShellProfile { $fileProfileBackup = $PROFILE + '.bak' cp $PROFILE $fileProfileBackup PowerShell_ISE $PROFILE # Replace with Desired IDE/ISE for Syntax Highlighting } Set-Alias fop funcOpenPowerShellProfile
Para satisfacer la paranoia de supervivencia:
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
fuente
entre muchas otras cosas:
function w { explorer . }
abre una ventana del explorador en el directorio actual
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 deshace de todo en mis archivos asp.net temporales (útil para trabajar en código administrado que tiene dependencias en código no administrado con errores)
function edit($x) { . 'C:\Program Files (x86)\Notepad++\notepad++.exe' $x }
edita $ x en el bloc de notas ++
fuente
De hecho, mantengo el mío en github .
fuente
Start-NewScope de Jeffrey Snover porque volver a lanzar el shell puede ser una lata.
Nunca me sentí cómodo con las opciones de diruse , así que :
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
También es útil para mirar el espacio en disco:
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
Para señalar cosas:
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
¿El grep del pobre? Para buscar archivos txt grandes.
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
Enumera los programas instalados en una computadora remota.
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
Haciendo meta, difundiendo el evangelio, todo eso
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
fuente
$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 }
fuente
Mantengo mi perfil vacío. En cambio, tengo carpetas de scripts que puedo navegar para cargar funciones y alias en la sesión. Una carpeta será modular, con bibliotecas de funciones y ensamblajes. Para el trabajo ad hoc, tendré un script para cargar alias y funciones. Si quiero munge registros de eventos, navegaría a una carpeta scripts \ eventlogs y ejecutaría
Hago esto porque necesito compartir scripts con otros o moverlos de una máquina a otra. Me gusta poder copiar una carpeta de scripts y ensamblajes y hacer que funcione en cualquier máquina para cualquier usuario.
Pero quieres una colección divertida de trucos. Aquí hay un guión del que dependen muchos de mis "perfiles". Permite llamadas a servicios web que utilizan SSL autofirmado para la exploración ad hoc de servicios web en desarrollo. Sí, mezclo libremente C # en mis scripts de 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() }
fuente
Gran pregunta. Debido a que trato con varios hosts de PowerShell diferentes, registro un poco cada uno de varios perfiles, solo para aclarar el contexto de cualquier otro mensaje. En
profile.ps1
, actualmente solo tengo eso, pero a veces lo cambio según el contexto:if ($PSVersionTable.PsVersion.Major -ge 3) { Write-Host "Executing $PSCommandPath" }
Mi anfitrión favorito es el ISE, en
Microsoft.PowerShellIse_profile.ps1
, tengo: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
fuente
De todo lo que no está en la lista, Start-Steroids tiene que ser mi favorito, excepto quizás Start-Transcript.
( http://www.powertheshell.com/isesteroids2-2/ )
fuente