Je me retrouve souvent à avoir besoin d'agrégats de base pour compter / additionner certaines choses., J'ai défini ces fonctions et les utilise souvent, elles fonctionnent très bien à la fin d'un pipeline:
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 }
}
Pour pouvoir obtenir le temps et le chemin avec les couleurs dans mon invite:
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 "> "
}
Les fonctions suivantes sont volées sur un blog et modifiées à mon goût, mais ls avec des couleurs est très sympa:
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 }
Et quelques raccourcis pour éviter les tâches de filtrage vraiment répétitives:
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))
{ $_ }
}
Pour configurer mon environnement de génération Visual Studio à partir de PowerShell, j'ai pris le VsVars32 à partir d' ici . et utilisez-le tout le temps.
la source
Cela itère à travers un script PSDrive et dot-sources tout ce qui commence par "lib-".
### --------------------------------------------------------------------------- ### Load function / filter definition library ### --------------------------------------------------------------------------- Get-ChildItem scripts:\lib-*.ps1 | % { . $_ write-host "Loading library file:`t$($_.name)" }
la source
start-transcript . Cela écrira toute votre session dans un fichier texte. Idéal pour former les nouveaux employés à l'utilisation de Powershell dans l'environnement.
la source
Mon invite contient:
$width = ($Host.UI.RawUI.WindowSize.Width - 2 - $(Get-Location).ToString().Length) $hr = New-Object System.String @('-',$width) Write-Host -ForegroundColor Red $(Get-Location) $hr
Ce qui me donne un séparateur entre les commandes qui est facile à voir lors du défilement vers l'arrière. Il me montre également le répertoire actuel sans utiliser d'espace horizontal sur la ligne sur laquelle je tape.
Par exemple:
la source
Voici mon profil pas si subtil
#============================================================================== # 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
la source
Je bascule quelques fonctions, et comme je suis un auteur de module, je charge généralement une console et j'ai désespérément besoin de savoir où et où.
write-host "Your modules are..." -ForegroundColor Red Get-module -li
Mourir dur nerding:
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> " }
Les fonctions obligatoires de tout ce que je peux PowerShell I vont ici ...
# 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) }
Je suis TOUJOURS administrateur donc j'ai besoin ...
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 }
Parfois, je veux démarrer l'explorateur en tant que personne autre que l'utilisateur connecté ...
# 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 }
C'est juste parce que c'est drôle.
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 }
J'en ai aussi un pour moi, car Win+ Lc'est trop loin ...
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 }
Quelques filtres? Je le pense...
filter FileSizeBelow($size){if($_.length -le $size){ $_ }} filter FileSizeAbove($size){if($_.Length -ge $size){$_}}
J'en ai également quelques-uns que je ne peux pas encore publier, car ils ne sont pas terminés, mais ils constituent essentiellement un moyen de conserver les informations d'identification entre les sessions sans les écrire sous forme de fichier crypté.
la source
# ---------------------------------------------------------- # 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; }
la source
Open-IE
cela, j'utilise l'ii
alias intégré pourInvoke-Item
.start http://google.com
J'ajoute cette fonction afin de pouvoir voir facilement l'utilisation du disque:
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") } }
la source
à propos.
Bien que je pense que cela a été remplacé par une version récente ou à venir.
############################################################################## ## 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 } } }
la source
Je garde un peu de tout. Surtout, mon profil configure tout l'environnement (y compris les scripts d'appel pour configurer mon environnement de développement .NET / VS et Java).
J'ai également redéfini la
prompt()
fonction avec mon propre style (le voir en action ), mis en place plusieurs alias vers d'autres scripts et commandes. et changer quoi$HOME
pointe vers.Voici mon script de profil complet .
la source
Vous bénéficierez si vous avez déjà recherché une stupide typo, par exemple. sortie de $ varsometext à la place de $ var someext
la source
############################################################################## # 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() }
Utile pour travailler avec xml, comme la sortie des commandes svn avec --xml.
la source
Cela crée un script: drive et l'ajoute à votre chemin. Notez que vous devez créer le dossier vous-même. La prochaine fois que vous aurez besoin d'y revenir, tapez simplement "scripts:" et appuyez sur Entrée, comme n'importe quelle lettre de lecteur dans Windows.
$env:path += ";$profiledir\scripts" New-PSDrive -Name Scripts -PSProvider FileSystem -Root $profiledir\scripts
la source
Cela ajoutera des composants logiciels enfichables que vous avez installés dans votre session PowerShell. La raison pour laquelle vous voudrez peut-être faire quelque chose comme ceci est qu'elle est facile à maintenir et fonctionne bien si vous synchronisez votre profil sur plusieurs systèmes. Si un composant logiciel enfichable n'est pas installé, vous ne verrez pas de message d'erreur.
-------------------------------------------------- -------------------------
Ajouter des composants logiciels enfichables tiers
-------------------------------------------------- -------------------------
$snapins = @( "Quest.ActiveRoles.ADManagement", "PowerGadgets", "VMware.VimAutomation.Core", "NetCmdlets" ) $snapins | ForEach-Object { if ( Get-PSSnapin -Registered $_ -ErrorAction SilentlyContinue ) { Add-PSSnapin $_ } }
la source
Je mets toutes mes fonctions et alias dans des fichiers de script séparés, puis je les trouve dans mon profil:
. c: \ scripts \ posh \ jdh-functions.ps1
la source
La fonction pour afficher l'historique complet de la commande tapée (Get-History, et son alias ne montrent par défaut que les 32 dernières commandes):
function ha { Get-History -count $MaximumHistoryCount }
la source
Vous pouvez voir mon profil PowerShell sur http://github.com/jamesottaway/windowspowershell
Si vous utilisez Git pour cloner mon dépôt dans votre dossier Documents (ou tout autre dossier au-dessus de «WindowsPowerShell» dans votre variable $ PROFILE), vous obtiendrez tout mon bien.
Le principal
profile.ps1
définit le sous-dossier avec le nomAddons
comme aPSDrive
, puis trouve tous les fichiers .ps1 sous ce dossier à charger.J'aime assez la
go
commande, qui stocke un dictionnaire de localisations abrégées à visiter facilement. Par exemple,go vsp
me conduira àC:\Visual Studio 2008\Projects
.J'aime aussi remplacer l'
Set-Location
applet de commande pour exécuter à la foisSet-Location
etGet-ChildItem
.Mon autre préféré est de pouvoir faire ce
mkdir
qui le faitSet-Location xyz
après avoir couruNew-Item xyz -Type Directory
.la source
Function funcOpenPowerShellProfile { Notepad $PROFILE } Set-Alias fop funcOpenPowerShellProfile
Seul un individu sagacement paresseux vous dirait que
fop
c'est tellement plus facile à taper qu'àNotepad $PROFILE
l'invite, à moins, bien sûr, que vous associez «fop» à un ninny anglais du 17ème siècle .Si vous le souhaitez, vous pouvez aller plus loin et le rendre quelque peu utile:
Function funcOpenPowerShellProfile { $fileProfileBackup = $PROFILE + '.bak' cp $PROFILE $fileProfileBackup PowerShell_ISE $PROFILE # Replace with Desired IDE/ISE for Syntax Highlighting } Set-Alias fop funcOpenPowerShellProfile
Pour satisfaire la paranoïa de survie:
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
la source
entre autres:
function w { explorer . }
ouvre une fenêtre d'explorateur dans le répertoire courant
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 débarrasse de tout dans mes fichiers asp.net temporaires (utile pour travailler sur du code géré qui a des dépendances sur du code non géré bogué)
function edit($x) { . 'C:\Program Files (x86)\Notepad++\notepad++.exe' $x }
édite $ x dans le bloc-notes ++
la source
Je garde le mien sur github .
la source
Start-NewScope de Jeffrey Snover car le redémarrage du shell peut être un glissement.
Je ne me suis jamais senti à l'aise avec les options de diruse , donc :
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
De même pratique pour regarder l'espace disque:
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
Pour pointer des choses:
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 du pauvre homme? Pour rechercher de gros fichiers 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
Répertorie les programmes installés sur un ordinateur distant.
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
Aller méta, répandre l'évangile, quoi de neuf
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
la source
$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 }
la source
Je garde mon profil vide. Au lieu de cela, j'ai des dossiers de scripts dans lesquels je peux naviguer pour charger des fonctionnalités et des alias dans la session. Un dossier sera modulaire, avec des bibliothèques de fonctions et d'assemblages. Pour le travail ad hoc, j'aurai un script pour charger les alias et les fonctions. Si je veux fusionner les journaux d'événements, je naviguerais vers un dossier scripts \ eventlogs et exécuterais
Je fais cela parce que j'ai besoin de partager des scripts avec d'autres ou de les déplacer d'une machine à l'autre. J'aime pouvoir copier un dossier de scripts et d'assemblages et le faire fonctionner sur n'importe quelle machine pour n'importe quel utilisateur.
Mais vous voulez une collection amusante de trucs. Voici un script dont dépendent beaucoup de mes "profils". Il permet d'appeler des services Web qui utilisent SSL auto-signé pour une exploration ad hoc des services Web en développement. Oui, je mélange librement C # dans mes scripts 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() }
la source
Excellente question. Étant donné que je traite avec plusieurs hôtes PowerShell différents, je me connecte un peu dans chacun de plusieurs profils, juste pour clarifier le contexte de tous les autres messages. Dans
profile.ps1
, je n'ai actuellement que cela, mais je le change parfois en fonction du contexte:if ($PSVersionTable.PsVersion.Major -ge 3) { Write-Host "Executing $PSCommandPath" }
Mon hôte préféré est l'ISE, en
Microsoft.PowerShellIse_profile.ps1
, j'ai: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
la source
De tout ce qui n'est pas déjà répertorié, Start-Steroids doit être mon préféré, sauf peut-être Start-Transcript.
( http://www.powertheshell.com/isesteroids2-2/ )
la source