ไฟล์ PowerShell "profile.ps1" ของคุณคืออะไร [ปิด]


85

คุณมีสิ่งสำคัญอะไรบ้าง (ฟังก์ชันนามแฝงสคริปต์เริ่มต้น) ในโปรไฟล์ของคุณ

คำตอบ:


23

ฉันมักจะพบว่าตัวเองต้องการข้อตกลงพื้นฐานในการนับ / รวมบางสิ่งฉันได้กำหนดฟังก์ชันเหล่านี้และใช้บ่อยครั้งมันทำงานได้ดีเมื่อสิ้นสุดไปป์ไลน์:

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

เพื่อให้สามารถรับเวลาและเส้นทางด้วยสีในพรอมต์ของฉัน:

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

ฟังก์ชั่นต่อไปนี้ถูกขโมยจากบล็อกและปรับเปลี่ยนให้เข้ากับรสนิยมของฉัน แต่ ls ด้วยสีนั้นดีมาก:

# LS.MSH 
# Colorized LS function replacement 
# /\/\o\/\/ 2006 
# http://mow001.blogspot.com 
function LL
{
    param ($dir = ".", $all = $false) 

    $origFg = $host.ui.rawui.foregroundColor 
    if ( $all ) { $toList = ls -force $dir }
    else { $toList = ls $dir }

    foreach ($Item in $toList)  
    { 
        Switch ($Item.Extension)  
        { 
            ".Exe" {$host.ui.rawui.foregroundColor = "Yellow"} 
            ".cmd" {$host.ui.rawui.foregroundColor = "Red"} 
            ".msh" {$host.ui.rawui.foregroundColor = "Red"} 
            ".vbs" {$host.ui.rawui.foregroundColor = "Red"} 
            Default {$host.ui.rawui.foregroundColor = $origFg} 
        } 
        if ($item.Mode.StartsWith("d")) {$host.ui.rawui.foregroundColor = "Green"}
        $item 
    }  
    $host.ui.rawui.foregroundColor = $origFg 
}

function lla
{
    param ( $dir=".")
    ll $dir $true
}

function la { ls -force }

และทางลัดบางอย่างเพื่อหลีกเลี่ยงงานกรองซ้ำ ๆ :

# behave like a grep command
# but work on objects, used
# to be still be allowed to use grep
filter match( $reg )
{
    if ($_.tostring() -match $reg)
        { $_ }
}

# behave like a grep -v command
# but work on objects
filter exclude( $reg )
{
    if (-not ($_.tostring() -match $reg))
        { $_ }
}

# behave like match but use only -like
filter like( $glob )
{
    if ($_.toString() -like $glob)
        { $_ }
}

filter unlike( $glob )
{
    if (-not ($_.tostring() -like $glob))
        { $_ }
}

2
ความคิดเห็นนี้ไม่มีค่า แต่ฉันอยากจะบอกว่าชื่อผู้ใช้ของคุณยอดเยี่ยมมาก
chrisf

ไม่มีปัญหาในการกำหนดขอบเขตหรือไม่? ฟังก์ชันทั้งหมด (หรือนามแฝง) ที่กำหนดไว้ภายในสคริปต์รวมถึงสคริปต์ PowerShell ไม่ได้ถูกกำหนดขอบเขตไว้ที่การเรียกใช้สคริปต์และหายไปในเชลล์การเรียกใช่หรือไม่ นี่เป็นกรณีบนเครื่องของฉัน ฉันควรทำอย่างไรดี?
Uri

10

การติดตั้ง Visual Studio สร้างสภาพแวดล้อมของฉันจาก PowerShell ผมเอา VsVars32 จากที่นี่ และใช้งานได้ตลอดเวลา

################################################# #############################
# แสดงสภาพแวดล้อมที่แปรผันเป็นชุดและตั้งค่าในเซสชัน PS นี้
################################################# #############################
ฟังก์ชัน Get-Batchfile (ไฟล์ $) 
{
    $ theCmd = "` "$ file`" & set " 
    cmd / c $ theCmd | Foreach-Object {
        $ thePath, $ theValue = $ _. แยก ('=')
        Set-Item -path env: $ thePath -value $ theValue
    }
}


################################################# #############################
# ตั้งค่าตัวแปร VS สำหรับเซสชัน PS นี้ที่จะใช้
################################################# #############################
ฟังก์ชัน VsVars32 ($ version = "9.0")
{
    $ theKey = "HKLM: SOFTWARE \ Microsoft \ VisualStudio \" + $ เวอร์ชัน
    $ theVsKey = get-ItemProperty $ theKey
    $ theVsInstallPath = [System.IO.Path] :: GetDirectoryName ($ theVsKey.InstallDir)
    $ theVsToolsDir = [System.IO.Path] :: GetDirectoryName ($ theVsInstallPath)
    $ theVsToolsDir = [System.IO.Path] :: Combine ($ theVsToolsDir, "Tools")
    $ theBatchFile = [System.IO.Path] :: รวม ($ theVsToolsDir, "vsvars32.bat")
    รับ Batchfile $ theBatchFile
    [System.Console] :: Title = "Visual Studio" + $ version + "Windows Powershell"
}

1
ฉันใช้leeholmes.com/blog/…เพื่อเรียกใช้ vcvars
Jay Bazuzi

สคริปต์ด้านบนไม่ทำงานบน Windows 64 บิต (เนื่องจากการเปลี่ยนเส้นทางรีจิสทรี WOW64)
Govert

ในกรณีนั้นให้เรียกใช้ในเชลล์ WOW64 cmd.exe 32 บิต เป็นไปไม่ได้เหรอ?
djangofan

10

ซึ่งจะวนซ้ำผ่านสคริปต์ PSDrive และ dot-source ทุกอย่างที่ขึ้นต้นด้วย "lib-"

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

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

9

เริ่มต้นการถอดเสียง สิ่งนี้จะเขียนทั้งเซสชันของคุณลงในไฟล์ข้อความ เหมาะสำหรับการฝึกอบรมพนักงานใหม่เกี่ยวกับวิธีใช้ Powershell ในสภาพแวดล้อม


2
+1 ขอบคุณสำหรับเคล็ดลับ ... นั่นช่วยแก้ปัญหาของฉันด้วยการบันทึกโครงสร้างการผสานรวมแบบต่อเนื่องทั้งในคอนโซลและไฟล์บันทึก ฉันผิดหวังที่ไม่ได้รับการบันทึกไว้อย่างดีทั้งใน "Windows Powershell pocket reference" หรือ "Windows PowerShell in Action" ฉันเดาว่านั่นคือสิ่งที่คุณเรียนรู้จากการฝึกฝน
Peter Walke

คำสั่ง Start-Transcript ไม่สามารถใช้ได้ในโฮสต์ PowerShell ทั้งหมดดังนั้นการวางไว้ในโปรไฟล์ที่ไม่ขึ้นกับโฮสต์ (profile.ps1) อาจทำให้เกิดข้อผิดพลาดในบางบริบท อาจมีประโยชน์ในโปรไฟล์เฉพาะโฮสต์เช่น (Microsoft.PowerShellISE_profile.ps1)
Burt_Harris

9

ข้อความแจ้งของฉันประกอบด้วย:

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

ซึ่งทำให้ฉันมีตัวแบ่งระหว่างคำสั่งที่มองเห็นได้ง่ายเมื่อเลื่อนกลับ นอกจากนี้ยังแสดงไดเร็กทอรีปัจจุบันโดยไม่ต้องใช้พื้นที่แนวนอนบนบรรทัดที่ฉันพิมพ์

ตัวอย่างเช่น:

C: \ Users \ Jay -------------------------------------------- -------------------------------------------------- ------------
[1] ป.ล. >


7

นี่คือโปรไฟล์ที่ไม่ละเอียดอ่อนของฉัน


    #==============================================================================
# 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 ไว้ที่ไหน จำเป็นต้องรีบูตเครื่อง o เริ่มบริการ winrm ใหม่หรือไม่
Kiquenet

@Kiquenet เพียงรีสตาร์ทเซสชัน powershell ของคุณ
Christopher Douglas

+1 แบ่งส่วนอย่างดีมาก ขอบคุณ.
Sabuncu

7

ฉันมีฟังก์ชั่นบางอย่างและเนื่องจากฉันเป็นผู้เขียนโมดูลฉันมักจะโหลดคอนโซลและจำเป็นต้องรู้ว่าอะไรอยู่ที่ไหน

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

ตายยาก 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> "
}

สิ่งที่จำเป็นที่ฉันสามารถทำได้ PowerShell ฉันจะทำงานที่นี่ ...

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

ฉันยังคงเป็นผู้ดูแลระบบดังนั้นฉันจึงต้องการ ...

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
}

บางครั้งฉันต้องการเริ่ม explorer เป็นคนอื่นที่ไม่ใช่ผู้ใช้ที่เข้าสู่ระบบ ...

# Restarts explorer as the user in $UserName
function New-Explorer
{
    # CLI prompt for password

    taskkill /f /IM Explorer.exe
    runas /noprofile /netonly /user:$UserName explorer
}

นี่เป็นเพียงเพราะมันตลก

Function Lock-RemoteWorkstation
{
    param(
        $Computername,
        $Credential
    )

    if(!(get-module taskscheduler))
    {
        Import-Module TaskScheduler
    }
    New-task -ComputerName $Computername -credential:$Credential |
        Add-TaskTrigger -In (New-TimeSpan -Seconds 30) |
        Add-TaskAction -Script `
        {
            $signature = @"
            [DllImport("user32.dll", SetLastError = true)]
            public static extern bool LockWorkStation();
            "@
                $LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru
                $LockWorkStation::LockWorkStation() | Out-Null
        } | Register-ScheduledTask TestTask -ComputerName $Computername -credential:$Credential
}

ฉันก็มีให้ฉันเหมือนกันเพราะWin+ Lอยู่ไกลเกินไป ...

Function llm # Lock Local machine
{
    $signature = @"
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool LockWorkStation();
    "@
        $LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWorkStation" -namespace Win32Functions -passthru

        $LockWorkStation::LockWorkStation() | Out-Null
}

ตัวกรองสองสามตัว? ฉันคิดอย่างนั้น ...

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

ฉันยังมีอีกสองสามรายการที่ยังโพสต์ไม่ได้เพราะยังไม่เสร็จ แต่โดยพื้นฐานแล้วเป็นวิธีที่จะรักษาข้อมูลรับรองระหว่างเซสชันโดยไม่ต้องเขียนเป็นไฟล์เข้ารหัส


สิ่งที่ดีที่นี่ฉันสนใจวิธีแก้ปัญหาของคุณในการคงข้อมูลรับรองระหว่างเซสชันโดยไม่ต้องเขียนลงในไฟล์
jkdba

@jkdba ปรากฎว่าฉันเขียนมันลงในไฟล์สิ่งที่จับได้คือเซสชันของฉันเท่านั้นที่สามารถถอดรหัสไฟล์ได้และในคอมพิวเตอร์ของฉันเท่านั้น ลองดูแล้วแจ้งให้เราทราบว่าเหมาะกับคุณหรือไม่
Christopher Douglas

1
อืมน่าสนใจฉันเล่นกับ Idea เดียวกันโดยทั่วไปแล้ว แต่สิ่งที่ฉันทำแทนคือการใช้ฐานข้อมูล keepass จากนั้นกำหนดค่าโปรไฟล์ของฉันให้เปิดการเชื่อมต่อกับฐานข้อมูลและเรียกข้อมูลรับรองของฉันเป็นสตริงที่ปลอดภัยและสร้างวัตถุข้อมูลรับรอง . ฉันทำงานกับเสื้อคลุมรหัส Keepass สุดหรูสำหรับ sdk ของพวกเขาคุณสามารถค้นหาได้จาก git ด้วยชื่อผู้ใช้ของฉัน repo ที่เรียกว่า PSKeePass (ตรวจสอบสาขา dev ณ ตอนนี้) สามารถขยายได้อย่างง่ายดายเพื่อใช้การเข้าสู่ระบบเครือข่ายและไฟล์คีย์สำหรับ การรักษาความปลอดภัยที่พิเศษ แต่ง่ายดายเพื่อให้ได้ผลคล้ายกับสิ่งที่คุณกำลังทำ
jkdba

@jkdba นั่นน่ากลัว! ฉันจะตรวจสอบรหัสของคุณอย่างแน่นอนและมีส่วนร่วมหากทำได้ ฉันเป็นแฟนตัวยงของ Keepass แต่ไม่เคยมีโอกาสใช้ SDK กับ PS เลย ขอบคุณ!
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
แทนที่จะOpen-IEใช้iiนามแฝงในตัวสำหรับInvoke-Item.
Jay Bazuzi

1
ii " google.com " ไม่ทำงาน เจย์ใช้แล้วเป็นอย่างไรบ้าง?
Kevin Berridge

ลองstart http://google.com
orad

5

ฉันเพิ่มฟังก์ชันนี้เพื่อให้สามารถดูการใช้งานดิสก์ได้อย่างง่ายดาย:

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

แม้ว่าฉันคิดว่าสิ่งนี้ถูกแทนที่ด้วยการเปิดตัวล่าสุดหรือที่กำลังจะมีขึ้น

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

ใช่ตอนนี้ Get-Help จะค้นหาเนื้อหาหัวข้อ
Keith Hill

5

ฉันเก็บทุกอย่างไว้เล็กน้อย ส่วนใหญ่โปรไฟล์ของฉันตั้งค่าสภาพแวดล้อมทั้งหมด (รวมถึงการเรียกสคริปต์เพื่อตั้งค่าสภาพแวดล้อมการพัฒนา. NET / VS และ Java ของฉัน)

ฉันยังกำหนดprompt()ฟังก์ชันใหม่ด้วยสไตล์ของฉันเอง ( ดูการใช้งานจริง ) ตั้งค่านามแฝงหลายรายการให้กับสคริปต์และคำสั่งอื่น ๆ และเปลี่ยนสิ่งที่$HOMEชี้ไป

นี่คือทั้งหมดของฉันสคริปต์รายละเอียด


4
Set-PSDebug -Strict 

คุณจะได้รับประโยชน์ฉันเคยค้นหาการพิมพ์ผิดโง่ ๆ เช่น เอาท์พุท $ varsometext แทน $ var sometext


ฉันทำข้อผิดพลาด type-o เป็นประจำ เป็นเรื่องน่าอายมากที่ทราบว่ารหัสที่คุณเปลี่ยนเพียง 12 ครั้งใช้งานได้ในแต่ละทาง แต่คุณยังสะกดชื่อคุณสมบัติไม่ถูก
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 เช่นเอาต์พุตจากคำสั่ง svn ด้วย --xml


3

สิ่งนี้จะสร้างสคริปต์: ขับเคลื่อนและเพิ่มลงในเส้นทางของคุณ หมายเหตุคุณต้องสร้างโฟลเดอร์ด้วยตัวเอง ครั้งต่อไปที่คุณต้องกลับไปที่เดิมเพียงพิมพ์ "scripts:" แล้วกด Enter เช่นเดียวกับอักษรระบุไดรฟ์ใน Windows

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

3

สิ่งนี้จะเพิ่มสแน็ปอินที่คุณติดตั้งไว้ในเซสชัน powershell ของคุณ เหตุผลที่คุณอาจต้องการทำสิ่งนี้ก็คือมันง่ายต่อการดูแลรักษาและทำงานได้ดีหากคุณซิงค์โปรไฟล์ของคุณในหลายระบบ หากไม่ได้ติดตั้งสแน็ปอินคุณจะไม่เห็นข้อความแสดงข้อผิดพลาด

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

เพิ่มสแน็ปอินของบุคคลที่สาม

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

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

3

ฉันใส่ฟังก์ชั่นและนามแฝงทั้งหมดของฉันในไฟล์สคริปต์ที่แยกจากกันจากนั้นก็จุดที่มาในโปรไฟล์ของฉัน:

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


2

ฟังก์ชั่นในการดูประวัติทั้งหมดของคำสั่งที่พิมพ์ (Get-History และนามแฝง h แสดงค่าเริ่มต้นเพียง 32 คำสั่งสุดท้าย):

function ha {
    Get-History -count $MaximumHistoryCount
}

2

คุณสามารถดูโปรไฟล์ PowerShell ของฉันได้ที่http://github.com/jamesottaway/windowspowershell

หากคุณใช้ Git เพื่อโคลน repo ของฉันลงในโฟลเดอร์ Documents ของคุณ (หรือโฟลเดอร์ใดก็ตามที่อยู่เหนือ 'WindowsPowerShell' ในตัวแปร $ PROFILE ของคุณ) คุณจะได้รับความดีทั้งหมดของฉัน

หลักprofile.ps1ตั้งค่าโฟลเดอร์ย่อยที่มีชื่อAddonsเป็น a PSDriveจากนั้นค้นหาไฟล์. ps1 ทั้งหมดที่อยู่ใต้โฟลเดอร์นั้นเพื่อโหลด

ฉันค่อนข้างชอบgoคำสั่งที่เก็บพจนานุกรมของตำแหน่งชวเลขเพื่อให้เยี่ยมชมได้ง่าย ยกตัวอย่างเช่นจะพาฉันไปgo vspC:\Visual Studio 2008\Projects

ฉันชอบการแทนที่Set-Locationcmdlet เพื่อเรียกใช้ทั้งSet-LocationและGet-ChildItem.

โปรดอื่น ๆ ของฉันคือความสามารถในการทำmkdirที่ไม่หลังจากที่ทำงานSet-Location xyzNew-Item xyz -Type Directory


2
Function funcOpenPowerShellProfile
{
    Notepad $PROFILE
}

Set-Alias fop funcOpenPowerShellProfile

มีเพียงคนเกียจคร้านเท่านั้นที่จะบอกคุณได้fopเป็นมากง่ายต่อการพิมพ์กว่าNotepad $PROFILEที่พร้อมท์เว้นแต่ของหลักสูตรที่คุณเชื่อมโยง "FOP" กับศตวรรษที่ 17 ภาษาอังกฤษคนไม่เต็มเต็ง


หากคุณต้องการคุณสามารถก้าวไปอีกขั้นและทำให้มันมีประโยชน์:

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

Set-Alias fop funcOpenPowerShellProfile

สำหรับผู้อยู่รอด - หวาดระแวงที่น่าพอใจ:

Function funcOpenPowerShellProfile
{
    $fileProfilePathParts = @($PROFILE.Split('\'))
    $fileProfileName = $fileProfilePathParts[-1]
    $fileProfilePathPartNum = 0
    $fileProfileHostPath = $fileProfilePathParts[$fileProfilePathPartNum] + '\'
    $fileProfileHostPathPartsCount = $fileProfilePathParts.Count - 2
        # Arrays start at 0, but the Count starts at 1; if both started at 0 or 1, 
        # then a -1 would be fine, but the realized discrepancy is 2
    Do
    {
        $fileProfilePathPartNum++
        $fileProfileHostPath = $fileProfileHostPath + `
            $fileProfilePathParts[$fileProfilePathPartNum] + '\'
    }
    While
    (
        $fileProfilePathPartNum -LT $fileProfileHostPathPartsCount
    )
    $fileProfileBackupTime = [string](date -format u) -replace ":", ""
    $fileProfileBackup = $fileProfileHostPath + `
        $fileProfileBackupTime + ' - ' + $fileProfileName + '.bak'
    cp $PROFILE $fileProfileBackup

    cd $fileProfileHostPath
    $fileProfileBackupNamePattern = $fileProfileName + '.bak'
    $fileProfileBackups = @(ls | Where {$_.Name -Match $fileProfileBackupNamePattern} | `
        Sort Name)
    $fileProfileBackupsCount = $fileProfileBackups.Count
    $fileProfileBackupThreshold = 5 # Change as Desired
    If
    (
        $fileProfileBackupsCount -GT $fileProfileBackupThreshold
    )
    {
        $fileProfileBackupsDeleteNum = $fileProfileBackupsCount - `
            $fileProfileBackupThreshold
        $fileProfileBackupsIndexNum = 0
        Do
        {

            rm $fileProfileBackups[$fileProfileBackupsIndexNum]
            $fileProfileBackupsIndexNum++;
            $fileProfileBackupsDeleteNum--
        }
        While
        (
            $fileProfileBackupsDeleteNum -NE 0
        )
    }

    PowerShell_ISE $PROFILE
        # Replace 'PowerShell_ISE' with Desired IDE (IDE's path may be needed in 
        # '$Env:PATH' for this to work; if you can start it from the "Run" window, 
        # you should be fine)
}

Set-Alias fop funcOpenPowerShellProfile

2

ท่ามกลางสิ่งอื่น ๆ อีกมากมาย:

function w {
    explorer .
}

เปิดหน้าต่าง explorer ในไดเร็กทอรีปัจจุบัน

function startover {
    iisreset /restart
    iisreset /stop

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

    iisreset /start
}

กำจัดทุกอย่างในไฟล์ asp.net ชั่วคราวของฉัน (มีประโยชน์สำหรับการทำงานกับโค้ดที่มีการจัดการที่มีการพึ่งพาโค้ดที่ไม่มีการจัดการบั๊กกี้)

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

แก้ไข $ x ใน notepad ++



2

Start-NewScopeของ Jeffrey Snoverเนื่องจากการเปิดตัวเชลล์ใหม่อาจเป็นการลาก

ฉันไม่เคยสบายใจกับตัวเลือกdiruse ดังนั้น :

function Get-FolderSizes {
  [cmdletBinding()]
  param(
    [parameter(mandatory=$true)]$Path,
    [parameter(mandatory=$false)]$SizeMB,
    [parameter(mandatory=$false)]$ExcludeFolder
  ) #close param
  $pathCheck = test-path $path
  if (!$pathcheck) {"Invalid path. Wants gci's -path parameter."; break}
  $fso = New-Object -ComObject scripting.filesystemobject
  $parents = Get-ChildItem $path -Force | where { $_.PSisContainer -and $_.name -ne $ExcludeFolder }
  $folders = Foreach ($folder in $parents) {
    $getFolder = $fso.getFolder( $folder.fullname.tostring() )
    if (!$getFolder.Size) { #for "special folders" like appdata
      $lengthSum = gci $folder.FullName -recurse -force -ea silentlyContinue | `
        measure -sum length -ea SilentlyContinue | select -expand sum
      $sizeMBs = "{0:N0}" -f ($lengthSum /1mb)      
    } #close if size property is null
      else { $sizeMBs = "{0:N0}" -f ($getFolder.size /1mb) }
      #else {$sizeMBs = [int]($getFolder.size /1mb) }
    New-Object -TypeName psobject -Property @{
       name = $getFolder.path;
      sizeMB = $sizeMBs
    } #close new obj property
  } #close foreach folder
  #here's the output
  $folders | sort @{E={[decimal]$_.sizeMB}} -Descending | ? {[decimal]$_.sizeMB -gt $SizeMB} | ft -auto
  #calculate the total including contents
  $sum = $folders | select -expand sizeMB | measure -sum | select -expand sum
  $sum += ( gci -file $path | measure -property length -sum | select -expand sum ) / 1mb
  $sumString = "{0:n2}" -f ($sum /1kb)
  $sumString + " GB total" 
} #end function
set-alias gfs Get-FolderSizes

ในทำนองเดียวกันมีประโยชน์สำหรับการดูพื้นที่ดิสก์:

function get-drivespace {
  param( [parameter(mandatory=$true)]$Computer)
  if ($computer -like "*.com") {$cred = get-credential; $qry = Get-WmiObject Win32_LogicalDisk -filter drivetype=3 -comp $computer -credential $cred }
  else { $qry = Get-WmiObject Win32_LogicalDisk -filter drivetype=3 -comp $computer }  
  $qry | select `
    @{n="drive"; e={$_.deviceID}}, `
    @{n="GB Free"; e={"{0:N2}" -f ($_.freespace / 1gb)}}, `
    @{n="TotalGB"; e={"{0:N0}" -f ($_.size / 1gb)}}, `
    @{n="FreePct"; e={"{0:P0}" -f ($_.FreeSpace / $_.size)}}, `
    @{n="name"; e={$_.volumeName}} |
  format-table -autosize
} #close drivespace

สำหรับการชี้ไปที่สิ่งของ:

function New-URLfile {
  param( [parameter(mandatory=$true)]$Target, [parameter(mandatory=$true)]$Link )
  if ($target -match "^\." -or $link -match "^\.") {"Full paths plz."; break}
  $content = @()
  $header = '[InternetShortcut]'
  $content += $header
  $content += "URL=" + $target
  $content | out-file $link  
  ii $link
} #end function

function New-LNKFile {
  param( [parameter(mandatory=$true)]$Target, [parameter(mandatory=$true)]$Link )
  if ($target -match "^\." -or $link -match "^\.") {"Full paths plz."; break}
  $WshShell = New-Object -comObject WScript.Shell
  $Shortcut = $WshShell.CreateShortcut($link)
  $Shortcut.TargetPath = $target
  $shortCut.save()
} #end function new-lnkfile

grep คนน่าสงสาร? สำหรับการค้นหาไฟล์ txt ขนาดใหญ่

function Search-TextFile {
  param( 
    [parameter(mandatory=$true)]$File,
    [parameter(mandatory=$true)]$SearchText
  ) #close param
  if ( !(test-path $File) ) {"File not found:" + $File; break}
  $fullPath = resolve-path $file | select -expand path
  $lines = [system.io.file]::ReadLines($fullPath)
  foreach ($line in $lines) { if ($line -match $SearchText) {$line} }
} #end function Search-TextFile

แสดงรายการโปรแกรมที่ติดตั้งบนคอมพิวเตอร์ระยะไกล

function Get-InstalledProgram { [cmdletBinding()] #http://blogs.technet.com/b/heyscriptingguy/archive/2011/11/13/use-powershell-to-quickly-find-installed-software.aspx
      param( [parameter(mandatory=$true)]$Comp,[parameter(mandatory=$false)]$Name )
      $keys = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall','SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
      TRY { $RegBase = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Comp) }
      CATCH {
        $rrSvc = gwmi win32_service -comp $comp -Filter {name='RemoteRegistry'}
        if (!$rrSvc) {"Unable to connect. Make sure that this computer is on the network, has remote administration enabled, `nand that both computers are running the remote registry service."; break}
        #Enable and start RemoteRegistry service
        if ($rrSvc.State -ne 'Running') {
          if ($rrSvc.StartMode -eq 'Disabled') { $null = $rrSvc.ChangeStartMode('Manual'); $undoMe2 = $true }
          $null = $rrSvc.StartService() ; $undoMe = $true       
        } #close if rrsvc not running
          else {"Unable to connect. Make sure that this computer is on the network, has remote administration enabled, `nand that both computers are running the remote registry service."; break}
        $RegBase = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$Comp)  
      } #close if failed to connect regbase
      $out = @()
      foreach ($key in $keys) {
         if ( $RegBase.OpenSubKey($Key) ) { #avoids errors on 32bit OS
          foreach ( $entry in $RegBase.OpenSubKey($Key).GetSubkeyNames() ) {
            $sub = $RegBase.OpenSubKey( ($key + '\' + $entry) )
            if ($sub) { $row = $null
              $row = [pscustomobject]@{
                Name = $RegBase.OpenSubKey( ($key + '\' + $entry) ).GetValue('DisplayName')
                InstallDate = $RegBase.OpenSubKey( ($key + '\' + $entry) ).GetValue('InstallDate')
                Version = $RegBase.OpenSubKey( ($key + '\' + $entry) ).GetValue('DisplayVersion')
              } #close row
              $out += $row
            } #close if sub
          } #close foreach entry
        } #close if key exists
      } #close foreach key
      $out | where {$_.name -and $_.name -match $Name}
      if ($undoMe) { $null = $rrSvc.StopService() }
      if ($undoMe2) { $null = $rrSvc.ChangeStartMode('Disabled') }
    } #end function

ไปเมตาเผยแพร่พระกิตติคุณอะไรก็ไม่รู้

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

ฉันเก็บโปรไฟล์ของฉันว่างเปล่า แต่ฉันมีโฟลเดอร์ของสคริปต์ที่สามารถนำทางเพื่อโหลดฟังก์ชันและนามแฝงในเซสชันได้ โฟลเดอร์จะเป็นแบบแยกส่วนพร้อมด้วยไลบรารีของฟังก์ชันและชุดประกอบ สำหรับงานเฉพาะกิจฉันจะมีสคริปต์สำหรับโหลดนามแฝงและฟังก์ชันต่างๆ ถ้าฉันต้องการปิดกั้นบันทึกเหตุการณ์ฉันจะไปที่โฟลเดอร์ scripts \ eventlogs และดำเนินการ

PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1

ฉันทำสิ่งนี้เพราะฉันต้องการแชร์สคริปต์กับผู้อื่นหรือย้ายจากเครื่องไปยังเครื่อง ฉันชอบที่จะสามารถคัดลอกโฟลเดอร์ของสคริปต์และแอสเซมบลีและให้มันทำงานบนเครื่องใดก็ได้สำหรับผู้ใช้ทุกคน

แต่คุณต้องการเคล็ดลับสนุก ๆ นี่คือสคริปต์ที่ "โปรไฟล์" ส่วนใหญ่ของฉันใช้ อนุญาตให้โทรไปยังบริการเว็บที่ใช้ SSL ที่ลงนามด้วยตนเองสำหรับการสำรวจบริการเว็บที่กำลังพัฒนา ใช่ฉันผสม C # ในสคริปต์พาวเวอร์เชลล์ของฉันได้อย่างอิสระ

# Using a target web service that requires SSL, but server is self-signed.  
# Without this, we'll fail unable to establish trust relationship. 
function Set-CertificateValidationCallback
{
    try
    {
       Add-Type @'
    using System;

    public static class CertificateAcceptor{

        public static void SetAccept()
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = AcceptCertificate;
        }

        private static bool AcceptCertificate(Object sender,
                        System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors policyErrors)
            {
                Console.WriteLine("Accepting certificate and ignoring any SSL errors.");
                return true;
            }
    }
'@
    }
    catch {} # Already exists? Find a better way to check.

     [CertificateAcceptor]::SetAccept()
}

0

คำถามที่ดี เนื่องจากฉันจัดการกับโฮสต์ PowerShell ที่แตกต่างกันฉันจึงทำการบันทึกเล็กน้อยในแต่ละโปรไฟล์เพื่อทำให้บริบทของข้อความอื่นชัดเจนขึ้น ในprofile.ps1ตอนนี้ฉันมีแค่นั้น แต่บางครั้งฉันก็เปลี่ยนตามบริบท:

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

โฮสต์ที่ฉันชอบคือ ISE ในMicrosoft.PowerShellIse_profile.ps1ฉันมี:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.