आपके 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.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
यह टिप्पणी कोई मूल्य नहीं जोड़ती है, लेकिन मैं सिर्फ यह कहना चाहता हूं कि आपका उपयोगकर्ता नाम भयानक है।
12

क्या कोई समस्या नहीं है? सभी कार्य (या उपनाम) एक स्क्रिप्ट के भीतर परिभाषित नहीं हैं, जिसमें PowerShell स्क्रिप्ट शामिल है, स्क्रिप्ट निष्पादन के लिए स्कोप किए जाते हैं, और कॉलिंग शेल पर वाष्पित होते हैं? मेरी मशीन पर यह मामला है। मुझे क्या करना चाहिए?
उड़ी

10

PowerShell से अपने Visual Studio बिल्ड वातावरण को सेटअप करने के लिए मैंने VsVars32 को यहां से लिया । और हर समय इसका उपयोग करें।

################################################## #############################
# एक बैच में पर्यावरण संस्करण का विस्तार करता है और उन्हें इस PS सत्र में सेट करता है
################################################## #############################
फ़ंक्शन Get-Batchfile ($ फ़ाइल) 
{
    $ theCmd = "` "$ फ़ाइल '' और सेट" 
    cmd / c $ theCmd | Foreach-Object {
        $ thePath, $ theValue = $ _। विभाजन ('=')
        सेट-आइटम -पाथ env: $ thePath -value $ theValue
    }
}


################################################## #############################
# इस PS सत्र के वीएस चर का उपयोग करने के लिए सेट करता है
################################################## #############################
फ़ंक्शन VsVars32 ($ संस्करण = "9.0")
{
    $ theKey = "HKLM: सॉफ़्टवेयर \ Microsoft \ VisualStudio \" + $ संस्करण
    $ theVsKey = get-ItemProperty $ theKey
    $ TheVsInstallPath = [System.IO.Path] :: GetDirectoryName ($ theVsKey.InstallDir)
    $ theVsToolsDir = [System.IO.Path] :: GetDirectoryName ($ theVsInstPPath)
    $ theVsToolsDir = [System.IO.Path] :: कम्बाइन (TheVsToolsDir, "टूल")
    $ theBatchFile = [System.IO.Path] :: कम्बाइन ($ theVsToolsDir, "vsvars32.bat")
    Get-Batchfile $ theBatchFile
    [System.Console] :: शीर्षक = "विज़ुअल स्टूडियो" + $ संस्करण + "विंडोज पॉवर्सशेल"
}

1
मैं vcvars को लागू करने के लिए leeholmes.com/blog/… का उपयोग करता हूं।
Jay Bazuzi

ऊपर दी गई स्क्रिप्ट 64-बिट विंडोज (WOW64 रजिस्ट्री पुनर्निर्देशन के कारण) पर काम नहीं करती है।
शासन

उस स्थिति में, बस इसे 32-बिट WOW64 cmd.exe शेल में चलाएं। क्या यह संभव नहीं था?
djangofan 18

10

यह एक स्क्रिप्ट के माध्यम से पुनरावृत्ति करता है, जो कि पीएसडीआरवी और डॉट-सोर्स सब कुछ है जो "लिब-" के साथ शुरू होता है।

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

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

9

आरंभ-प्रतिलेख । यह आपके पूरे सत्र को एक पाठ फ़ाइल में लिख देगा। पर्यावरण में पॉवरशेल का उपयोग करने के तरीके पर नए काम के प्रशिक्षण के लिए बढ़िया।


2
+1 टिप के लिए धन्यवाद ... कि एक निरंतर एकीकरण लॉगिंग के साथ मेरी समस्या तय की कंसोल और लॉग फ़ाइल दोनों का निर्माण। मुझे निराशा है कि इसे "विंडोज पॉवर्सशैल पॉकेट संदर्भ" या "विंडोज पॉवरशेल इन एक्शन" में अच्छी तरह से प्रलेखित नहीं किया गया था। मुझे लगता है कि आप अभ्यास से कुछ सीखते हैं।
पीटर वॉके

हेड-अप के रूप में, स्टार्ट-ट्रांसक्रिप्ट कमांड सभी पॉवरशेल होस्ट्स में उपलब्ध नहीं है, इसलिए इसे होस्ट-इंडिपेंडेंट प्रोफाइल (profile.ps1) में डालना कुछ संदर्भों में त्रुटियां उत्पन्न कर सकता है। यह (Microsoft.PowerShellISE_profile.ps1) जैसे होस्ट-विशिष्ट प्रोफाइल में उपयोगी हो सकता है।
बर्ट_हैरिस

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 -------------------------------------------- -------------------------------------------------- ------------
[१] पीएस>


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


मैं प्रोफ़ाइल कहां कॉपी करता हूं .ps1? क्या रिबूट मशीन ओ रीस्टार्ट विप्रम सेवा की आवश्यकता है?
किकेनेट

@Kiquenet, बस अपनी शक्तियाँ सत्र को पुनः आरंभ करें।
क्रिस्टोफर डगलस

+1, बहुत अच्छी तरह से खंडित। धन्यवाद।
सबुनकु

7

मैंने कुछ फ़ंक्शन किए हैं, और चूंकि मैं एक मॉड्यूल लेखक हूं, इसलिए मैं आमतौर पर एक कंसोल को लोड करता हूं और यह जानने की सख्त आवश्यकता है कि क्या है।

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

मरो कठिन पालन:

function prompt
{
    $host.UI.RawUI.WindowTitle = "ShellPower"
    # Need to still show the working directory.
    #Write-Host "You landed in $PWD"

    # Nerd up, yo.
    $Str = "Root@The Matrix"
    "$str> "
}

कुछ भी मैं PowerShell मैं कार्य करेगा यहाँ जाने के लिए अनिवार्य होगा ...

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

कभी-कभी मैं एक्सप्लोरर को उपयोगकर्ता में लॉग इन के अलावा किसी और के रूप में शुरू करना चाहता हूं ...

# 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 ने बताया कि मैंने उन्हें एक फ़ाइल के लिए लिखा था, कैच केवल मेरा सत्र है जो केवल मेरे कंप्यूटर पर फ़ाइल को डिक्रिप्ट कर सकता है। एक शॉट दें और मुझे बताएं कि क्या यह आपके लिए काम करता है।
क्रिस्टोफर डगलस

1
हम्म दिलचस्प, मैंने मूल रूप से एक ही आइडिया के साथ खेला है, लेकिन मैंने इसके बजाय जो किया है वह एक कैपास डेटाबेस का उपयोग करने के लिए है और फिर डेटाबेस से कनेक्शन खोलने और एक सुरक्षित स्ट्रिंग के रूप में मेरी साख को पुनः प्राप्त करने के लिए मेरा प्रोफाइल कॉन्फ़िगर किया गया है और एक क्रेडेंशियल ऑब्जेक्ट बनाएं । मैं उनके sdk के लिए एक पॉश कीप कोड कोड रैपर पर काम कर रहा हूँ, आप इसे अपने यूज़रनेम के साथ git पर पा सकते हैं, PSKeePass नामक रेपो (अब के रूप में देव शाखा की जाँच करें।) इसे आसानी से नेटवर्क लॉगिन और कीफ़ाइल का उपयोग करने के लिए विस्तारित किया जा सकता है। आप जो कर रहे हैं, उसके समान प्रभाव को प्राप्त करने के लिए अतिरिक्त लेकिन आसान सुरक्षा।
१२:२k बजे जक्कबा

@jkdba भयानक है! मैं निश्चित रूप से आपके कोड की जांच करने जा रहा हूं और अगर मैं कर सकता हूं तो योगदान दें। मैं रखैल का बहुत बड़ा प्रशंसक हूं, लेकिन कभी भी उनके एसडीके को पीएस के साथ उपयोग करने का अवसर नहीं मिला। धन्यवाद!
क्रिस्टोफर डगलस

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
जे Bazuzi

1
ii " google.com " काम नहीं करता है। आप इसे कैसे उपयोग कर रहे हैं जे?
केविन बेरिज

प्रयास करें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

अनुरूप।

हालांकि मुझे लगता है कि यह हाल ही में या आगामी रिलीज से अलग हो गया है।

############################################################################## 
## 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 अब विषय सामग्री खोज लेगी।
कीथ हिल

5

मैं हर चीज का थोड़ा-बहुत हिस्सा रखता हूं। अधिकतर, मेरी प्रोफ़ाइल सभी वातावरण सेट करती है (मेरे .NET / VS और Java विकास पर्यावरण को सेट करने के लिए स्क्रिप्ट्स को कॉल करने सहित)।

मैं prompt()अपनी शैली से कार्य को फिर से परिभाषित करता हूं ( इसे कार्रवाई में देखें ), कई लिपियों को अन्य लिपियों और आदेशों पर सेट करें। और जो $HOMEइंगित करता है उसे बदलें ।

यहां मेरी पूरी प्रोफ़ाइल स्क्रिप्ट है


4
Set-PSDebug -Strict 

आपको फायदा होगा कि आपने कभी एक बेवकूफ टाइपो की खोज की। $ var के बजाय $ varsometext का आउटपुट देता है


मैं नियमित रूप से टाइप-ओ त्रुटियां करता हूं। यह महसूस करने के लिए बहुत ही विनम्र है कि आप जिस कोड को लगभग 12 बार बदलते हैं वह प्रत्येक तरीके से काम करता है, लेकिन आप अभी भी संपत्ति के नाम को सही नहीं बता सकते हैं।
क्रिस्टोफर डगलस

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

यह एक स्क्रिप्ट बनाता है: ड्राइव करें और इसे अपने पथ पर जोड़ता है। ध्यान दें, आपको स्वयं फ़ोल्डर बनाना होगा। अगली बार आपको इसे वापस लाने की जरूरत है, बस "स्क्रिप्ट:" टाइप करें और एंटर करें, जैसे विंडोज में कोई ड्राइव लेटर।

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

3

यह आपके द्वारा अपने पावरशेल सत्र में लगाए गए स्नैपइन को जोड़ देगा। यदि आप ऐसा कुछ करना चाहते हैं तो इसका कारण यह है कि इसे बनाए रखना आसान है, और यदि आप अपनी प्रोफ़ाइल को कई प्रणालियों में सिंक करते हैं तो यह बेहतर है। यदि एक स्नैपइन स्थापित नहीं है, तो आपको एक त्रुटि संदेश दिखाई नहीं देगा।

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

तृतीय-पक्ष स्नैपइन्स जोड़ें

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

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

3

मैंने अपने सभी कार्यों और उपनामों को अलग-अलग स्क्रिप्ट फ़ाइलों में डाल दिया और फिर उन्हें अपनी प्रोफ़ाइल में डॉट स्रोत:

। c: \ लिपियों \ आलीशान \ jdh-functions.ps1


2

टाइप किए गए कमांड के पूरे इतिहास को देखने के लिए फ़ंक्शन (गेट-हिस्ट्री, और उसका उपनाम एच डिफ़ॉल्ट केवल 32 अंतिम कमांड दिखाता है):

function ha {
    Get-History -count $MaximumHistoryCount
}

2

आप http://github.com/jamesottaway/windowspowershell पर मेरी पावरशेल प्रोफ़ाइल देख सकते हैं

यदि आप मेरे दस्तावेज़ फ़ोल्डर (या जो भी फ़ोल्डर आपके $ PROFILE चर में 'WindowsPowerShell' से ऊपर है) में मेरे रेपो को क्लोन करने के लिए Git का उपयोग करते हैं, तो आपको मेरी सारी अच्छाई मिल जाएगी।

मुख्य एक के रूप profile.ps1में नाम के साथ सबफ़ोल्डर सेट Addonsकरता है PSDrive, और फिर लोड करने के लिए उस फ़ोल्डर के नीचे सभी .ps1 फाइलें पाता है।

मुझे goकमांड पसंद है , जो आसानी से घूमने के लिए शॉर्टहैंड स्थानों का एक शब्दकोश संग्रहीत करता है। उदाहरण के लिए, go vspमुझे ले जाएगा C:\Visual Studio 2008\Projects

मैं Set-Locationदोनों चलाने के लिए cmdlet को ओवरराइड करना भी पसंद करता हूं Set-Locationऔर Get-ChildItem

मेरा अन्य पसंदीदा ऐसा करने में सक्षम है mkdirजो Set-Location xyzदौड़ने के बाद करता है New-Item xyz -Type Directory


2
Function funcOpenPowerShellProfile
{
    Notepad $PROFILE
}

Set-Alias fop funcOpenPowerShellProfile

केवल एक बहुत ही आलसी व्यक्ति आपको बताएगा कि प्रॉम्प्ट पर fopटाइप करना कितना आसान है Notepad $PROFILE, जब तक कि निश्चित रूप से, आप "फोप" को 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 .
}

वर्तमान निर्देशिका में एक एक्सप्लोरर विंडो खोलता है

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 का संपादन करता है



2

जेफरी स्नोवर के स्टार्ट-न्यूस्कोप क्योंकि शेल को फिर से लॉन्च करना एक ड्रैग हो सकता है।

मुझे ड्यूरस विकल्पों के साथ कभी आराम नहीं मिला , इसलिए :

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

गरीब आदमी की पकड़? बड़ी 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

मैं अपनी प्रोफाइल खाली रखता हूं। इसके बजाय, मेरे पास स्क्रिप्ट के फ़ोल्डर हैं जो मैं कार्यक्षमता और उपनाम को सत्र में लोड करने के लिए नेविगेट कर सकता हूं। एक फ़ोल्डर मॉड्यूलर होगा, जिसमें कार्यों और विधानसभाओं के पुस्तकालय होंगे। तदर्थ कार्य के लिए, मेरे पास उपनाम और कार्य लोड करने के लिए एक स्क्रिप्ट होगी। अगर मैं इवेंट लॉग्स को मून करना चाहता हूं, तो मैं एक फ़ोल्डर स्क्रिप्ट्स \ eventlogs पर नेविगेट करूंगा और निष्पादित करूंगा

PS > . .\DotSourceThisToLoadSomeHandyEventLogMonitoringFunctions.ps1

मैं ऐसा इसलिए करता हूं क्योंकि मुझे अन्य लोगों के साथ स्क्रिप्ट साझा करने या उन्हें मशीन से मशीन पर स्थानांतरित करने की आवश्यकता है। मुझे स्क्रिप्ट और असेंबली का एक फ़ोल्डर कॉपी करने में सक्षम होना पसंद है और यह किसी भी उपयोगकर्ता के लिए किसी भी मशीन पर काम करता है।

लेकिन आप ट्रिक्स का एक मजेदार संग्रह चाहते हैं। यहां एक स्क्रिप्ट है जो मेरे कई "प्रोफाइल" पर निर्भर करती है। यह उन वेब सेवाओं को कॉल करने की अनुमति देता है जो विकास में वेब सेवाओं के तदर्थ अन्वेषण के लिए स्व हस्ताक्षरित एसएसएल का उपयोग करते हैं। हां, मैं अपनी शक्तियों वाली लिपियों में स्वतंत्र रूप से 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

बड़ा सवाल है। क्योंकि मैं कई अलग-अलग पॉवरशेल मेजबानों से निपटता हूं, इसलिए मैं किसी भी अन्य संदेश के संदर्भ को स्पष्ट करने के लिए कई प्रोफाइलों में से प्रत्येक में थोड़ी लॉगिंग करता हूं। 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

0

शायद पहले से सूचीबद्ध सब कुछ में से, स्टार्ट-स्टेरॉयड को मेरा पसंदीदा होना चाहिए, शायद स्टार्ट-ट्रांसक्रिप्ट को छोड़कर।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.