PowerShell `profile.ps1` dosyanızda neler var? [kapalı]


Yanıtlar:


23

Çoğu zaman kendimi bazı şeyleri saymak / toplamak için bazı temel toplamlara ihtiyaç duyarken buluyorum. Bu işlevleri tanımladım ve sık sık kullandım, bir boru hattının sonunda gerçekten güzel çalışıyorlar:

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

Bilgi istemimdeki renklerle zaman ve yol alabilmek için:

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

Aşağıdaki işlevler bir blogdan çalındı ​​ve zevkime uyacak şekilde değiştirildi, ancak renklerle çok güzel:

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

Ve gerçekten tekrarlayan filtreleme görevlerinden kaçınmak için bazı kısayollar:

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

2
Bu yorum bir değer katmaz, ancak kullanıcı adınızın harika olduğunu söylemek istiyorum.
chrisf

Kapsam belirleme sorunu yok mu? PowerShell betiği de dahil olmak üzere bir betik içinde tanımlanan tüm işlevler (veya takma adlar), betik yürütme kapsamına alınmaz ve çağıran kabukta buharlaşmaz mı? Bu benim makinemdeki durum. Ne yapmalıyım?
Uri

10

PowerShell'den Visual Studio derleme ortamımı kurmak için VsVars32'yi buradan aldım . ve her zaman kullanın.

##################################################### ##############################
# Bir toplu işteki ortam değişkenlerini ortaya çıkarır ve bunları bu PS oturumunda ayarlar
##################################################### ###############################
fonksiyon Get-Batchfile ($ dosya) 
{
    $ theCmd = "" "$ dosya`" & ayarla " 
    cmd / c $ theCmd | Foreach-Object {
        $ thePath, $ theValue = $ _. bölme ('=')
        Set-Item -path env: $ thePath -value $ theValue
    }
}


##################################################### ###############################
# Bu PS oturumunun kullanacağı VS değişkenlerini ayarlar
##################################################### ###############################
işlev VsVars32 ($ sürüm = "9.0")
{
    $ theKey = "HKLM: YAZILIM \ Microsoft \ VisualStudio \" + $ version
    $ theVsKey = get-ItemProperty $ theKey
    $ theVsInstallPath = [System.IO.Path] :: GetDirectoryName ($ theVsKey.InstallDir)
    $ theVsToolsDir = [System.IO.Path] :: GetDirectoryName ($ theVsInstallPath)
    $ theVsToolsDir = [System.IO.Path] :: Combine ($ theVsToolsDir, "Araçlar")
    $ theBatchFile = [System.IO.Path] :: Combine ($ theVsToolsDir, "vsvars32.bat")
    Get-Batchfile $ theBatchFile
    [System.Console] :: Title = "Visual Studio" + $ version + "Windows Powershell"
}

1
Kullandığım leeholmes.com/blog/... vcvars çağırmak için.
Jay Bazuzi

Yukarıdaki komut dosyası 64 bit Windows'ta çalışmaz (WOW64 kayıt defteri yeniden yönlendirmesi nedeniyle).
Govert

Bu durumda, 32-bit WOW64 cmd.exe kabuğunda çalıştırın. Bu mümkün değil miydi?
djangofan

10

Bu, "lib-" ile başlayan her şeyi bir komut dosyası PSDrive ve nokta kaynakları aracılığıyla yineler.

### ---------------------------------------------------------------------------
### Load function / filter definition library
### ---------------------------------------------------------------------------

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

9

başlangıç-transkript . Bu, tüm oturumunuzu bir metin dosyasına yazacaktır. Powershell'i çevrede nasıl kullanacakları konusunda yeni çalışanların eğitimi için harika.


2
+1 İpucu için teşekkürler ... Bu, hem konsola hem de bir günlük dosyasına Sürekli Entegrasyon derlemesini kaydetme sorunumu çözdü. "Windows Powershell cep referansı" veya "Windows PowerShell İş Başında" belgelerinde iyi belgelenmemesi beni hayal kırıklığına uğrattı. Sanırım bu pratikten öğrendiğin bir şey.
Peter Walke

Bir uyarı olarak, Start-Transcript komutu tüm PowerShell ana bilgisayarlarında mevcut değildir, bu nedenle onu ana bilgisayardan bağımsız profile (profile.ps1) koymak bazı bağlamlarda hatalar oluşturabilir. (Microsoft.PowerShellISE_profile.ps1) gibi ana bilgisayara özel profillerde yararlı olabilir.
Burt_Harris

9

İstemim şunları içeriyor:

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

Bu da bana geri kaydırırken görmesi kolay komutlar arasında bir ayırıcı sağlıyor. Ayrıca yazdığım satırda yatay boşluk kullanmadan bana geçerli dizini gösteriyor.

Örneğin:

C: \ Kullanıcılar \ Jay -------------------------------------------- -------------------------------------------------- ------------
[1] PS>


7

İşte benim o kadar ince olmayan profilim


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


Profile.ps1'i nereye kopyalarım? Winrm hizmetini yeniden başlatmak için makinenin yeniden başlatılması gerekli mi?
Kiquenet

@Kiquenet, sadece powershell oturumunuzu yeniden başlatın.
Christopher Douglas

+1, Çok güzel bölümlere ayrılmış. Teşekkürler.
Sabuncu

7

Birkaç işlevi sallıyorum ve modül yazarı olduğum için genellikle bir konsol yüklüyorum ve çaresizce neyin nerede olduğunu bilmem gerekiyor.

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

Zor bir şekilde öl:

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 yapabileceğim zorunlu her şey, işlevleri buraya gelecek ...

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

Ben hala bir yöneticiyim, bu yüzden ihtiyacım var ...

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
}

Bazen explorer'ı oturum açmış kullanıcı dışında biri olarak başlatmak istiyorum ...

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

Bu sadece komik olduğu için.

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
}

Benim için de bir tane var, çünkü Win+ Lçok uzakta ...

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
}

Birkaç filtre mi? Sanırım öyle ...

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

Ayrıca henüz gönderemediğim birkaç tane var, çünkü henüz bitmedi, ancak temelde oturumlar arasında kimlik bilgilerini şifrelenmiş bir dosya olarak yazmadan sürdürmenin bir yolu.


Burada güzel şeyler var, oturumlar arasında kimlik bilgilerini bir dosyaya yazmadan kalıcı hale getirme çözümünüzle ilgilenirim.
jkdba

@jkdba onları bir dosyaya yazdığım ortaya çıktı, yakalama yalnızca oturumum dosyanın şifresini çözebilir ve yalnızca bilgisayarımda. Şuna bir şans verin ve sizin için işe yarayıp yaramadığını bana bildirin.
Christopher Douglas

1
Hmm İlginç, temelde aynı Fikirle oynadım, ancak bunun yerine yaptığım şey bir Keepass veritabanı kullanmak ve ardından profilimi veritabanına bir bağlantı açmak ve kimlik bilgilerimi güvenli bir dize olarak almak ve bir kimlik bilgisi nesnesi oluşturmak için yapılandırmak. . SDK'ları için lüks bir Keepass kod sarmalayıcısı üzerinde çalışıyordum, git üzerinde benim kullanıcı adımla bulabilirsin, PSKeePass adlı repo (şu an için geliştirme dalına göz atın.) Bir ağ girişi ve anahtar dosyası kullanmak için kolayca genişletilebilir Yaptığınız şeye benzer bir etki elde etmek için ekstra ama kolay güvenlik.
jkdba

@jkdba bu harika! Kodunuzu kesinlikle kontrol edeceğim ve yapabilirsem katkıda bulunacağım. Büyük bir tutkun hayranıyım, ancak SDK'larını PS ile kullanma fırsatım olmadı. Teşekkürler!
Christopher Douglas

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

2
Bunun yerine Open-IEiçin yerleşik iitakma adı kullanıyorum Invoke-Item.
Jay Bazuzi

1
ii " google.com " çalışmıyor. Nasıl kullanıyorsun Jay?
Kevin Berridge

Deneyinstart http://google.com
orad

5

Disk kullanımını kolayca görebilmem için bu işlevi ekliyorum:

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

    }
}

5

apropos.

Bununla birlikte, bunun yerine yeni veya gelecek bir sürümün geçtiğini düşünüyorum.

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

Evet, Get-Help artık konu içeriğini arayacak.
Keith Hill

5

Her şeyden biraz saklıyorum. Çoğunlukla, profilim tüm ortamı ayarlar (.NET / VS ve Java geliştirme ortamımı kurmak için komut dosyalarını çağırmak dahil).

Ayrıca prompt()işlevi kendi tarzımla yeniden tanımlıyorum ( çalışırken görün ), diğer komut dosyalarına ve komutlara birkaç takma ad ayarlıyorum. ve neyi $HOMEişaret ettiğini değiştirin .

İşte tam profil komut dosyam .


4
Set-PSDebug -Strict 

Şimdiye kadar aptal bir Yazım hatası aradığınızda yararlanacaksınız, örneğin. $ var sometext yerine $ varsometext üretiliyor


Düzenli olarak tip-o hataları yapıyorum. Yaklaşık 12 kez değiştirdiğiniz kodun her şekilde çalıştığını anlamak çok alçakgönüllü, ancak yine de mülk adını doğru heceleyemiyorsunuz.
Christopher Douglas

3
############################################################################## 
# 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 ile svn komutlarından çıktı almak gibi xml ile çalışmak için kullanışlıdır.


3

Bu bir komut dosyası oluşturur: sürücü ve onu yolunuza ekler. Unutmayın, klasörü kendiniz oluşturmanız gerekir. Bir dahaki sefere geri dönmeniz gerektiğinde, sadece "scripts:" yazın ve Windows'taki herhangi bir sürücü harfi gibi enter tuşuna basın.

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

3

Bu, powershell oturumunuza yüklediğiniz ekleri ekleyecektir. Bunun gibi bir şey yapmak istemenizin nedeni, bakımının kolay olması ve profilinizi birden çok sistem arasında eşitlerseniz iyi çalışmasıdır. Bir ek bileşen kurulu değilse, bir hata mesajı görmezsiniz.

-------------------------------------------------- -------------------------

Üçüncü taraf ek bileşenleri ekleyin

-------------------------------------------------- -------------------------

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

3

Tüm işlevlerimi ve takma adlarımı ayrı komut dosyalarına koydum ve ardından bunları profilimde nokta kaynağı olarak belirledim:

. c: \ scripts \ posh \ jdh-functions.ps1


2

Yazılan komutun tüm geçmişini görüntüleme işlevi (Get-History ve diğer adı h varsayılan olarak yalnızca son 32 komutu gösterir):

function ha {
    Get-History -count $MaximumHistoryCount
}

2

PowerShell profilimi http://github.com/jamesottaway/windowspowershell adresinde görebilirsiniz.

Depomu Belgeler klasörünüze klonlamak için Git'i kullanırsanız (veya $ PROFILE değişkeninizde 'WindowsPowerShell'in üzerindeki klasör herhangi bir klasörde), tüm iyiliğimi alırsınız.

Ana profile.ps1, adı olan alt klasörü AddonsbirPSDrive , sonra ve yüke bu klasöre altında tüm .ps1 dosyaları bulur.

goKolayca ziyaret edilebilecek kısa konumlar sözlüğünü saklayan komutu oldukça beğendim . Mesela go vspbeni götürecekC:\Visual Studio 2008\Projects .

Ben de geçersiz kılma gibi Set-Locationcmdlet'ini hem çalıştırmak Set-Locationve Get-ChildItem.

Bir diğer favorim mkdirde koştuktan Set-Location xyzsonra olanı yapabilmek New-Item xyz -Type Directory.


2
Function funcOpenPowerShellProfile
{
    Notepad $PROFILE
}

Set-Alias fop funcOpenPowerShellProfile

Sadece tembel tembel bir birey , elbette "fop" u 17. yüzyıl İngiliz dokuzu ile ilişkilendirmedikçe, yazmanın komut isteminden fopçok daha kolay olduğunu söyleyebilir .Notepad $PROFILE


İsterseniz, bir adım öteye taşıyabilir ve bir şekilde yararlı hale getirebilirsiniz:

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

Set-Alias fop funcOpenPowerShellProfile

Hayatta kalma paranoyasını tatmin etmek için:

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

2

diğer birçok şeyin yanı sıra:

function w {
    explorer .
}

mevcut dizinde bir gezgin penceresi açar

function startover {
    iisreset /restart
    iisreset /stop

    rm "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\*.*" -recurse -force -Verbose

    iisreset /start
}

geçici asp.net dosyalarımdaki her şeyden kurtuluyor (buggy yönetilmeyen koda bağımlılıkları olan yönetilen kod üzerinde çalışmak için kullanışlıdır)

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

$ x'i notepad ++ içinde düzenler



2

Jeffrey Snover'ın Start-NewScope'u çünkü kabuğun yeniden başlatılması zor olabilir.

Pislik seçeneklerine hiç alışamadım , bu yüzden :

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

Disk alanına bakmak için de aynı şekilde kullanışlıdır:

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

Bir şeylere işaret etmek için:

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

Zavallı adamın grep'i? Büyük txt dosyalarını aramak için.

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

Uzak bir bilgisayarda yüklü programları listeler.

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

Meta gidiyor, müjdeyi yayıyorum

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

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

1

Profilimi boş tutuyorum. Bunun yerine, oturuma işlevsellik ve takma adlar yüklemek için gezinebileceğim komut dosyası klasörlerim var. Bir klasör, işlev kitaplıkları ve derlemelerle modüler olacaktır. Geçici çalışma için, takma adları ve işlevleri yüklemek için bir komut dosyam olacak. Olay günlüklerini silmek istersem, komut dosyaları \ olay günlükleri klasörüne gidip çalıştırırım

PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1

Bunu yapıyorum çünkü komut dosyalarını başkalarıyla paylaşmam veya makineden makineye taşımam gerekiyor. Bir komut dosyası ve derleme klasörünü kopyalayabilmeyi ve herhangi bir kullanıcı için herhangi bir makinede çalışmasını sağlayabilmeyi seviyorum.

Ama eğlenceli bir numara koleksiyonu istiyorsunuz. İşte "profillerimin" çoğunun bağlı olduğu bir komut dosyası. Geliştirme aşamasındaki web hizmetlerinin özel olarak araştırılması için kendinden imzalı SSL kullanan web hizmetlerine çağrı yapılmasına izin verir. Evet, powershell betiklerimde C # 'ı özgürce karıştırıyorum.

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

0

Harika soru. Birkaç farklı PowerShell ana bilgisayarıyla çalıştığım için, diğer mesajların içeriğini daha net hale getirmek için birkaç profilin her birinde biraz oturum açıyorum. İçinde profile.ps1, şu anda sadece buna sahibim, ancak bazen içeriğe göre değiştiriyorum:

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

En sevdiğim ev sahibi ISE Microsoft.PowerShellIse_profile.ps1, bende:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.