كيفية إعادة تحميل ملف تعريف المستخدم من Script File in PowerShell

StackOverflow https://stackoverflow.com/questions/567650

  •  05-09-2019
  •  | 
  •  

سؤال

أريد إعادة تحميل ملف تعريف المستخدم الخاص بي من ملف نصي. اعتقدت أن DOT مصادره من خلال ملف البرنامج النصي سيقوم بالخدعة، لكنها لا تعمل:

# file.ps1
. $PROFILE

ومع ذلك، فإنه يعمل إذا قمت بتشغيله من مترجم PowerShell's.

لماذا أريد أن أفعل هذا؟

قمت بتشغيل هذا البرنامج النصي في كل مرة أقوم فيها بتحديث ملف التعريف الخاص بي وأريد اختباره، لذلك أود تجنب الاضطرار إلى إعادة تشغيل PowerShell لتحديث البيئة.

هل كانت مفيدة؟

المحلول

لذلك، قد يعمل النهج الذي حددته كإجابة داخل موجه الأوامر PowerShell، لكنه لا يعمل داخل PowerShell ISE (الذي، لي، يوفر جلسة PowerShell فائقة) وربما لن يعمل بشكل صحيح في بيئات PowerShell الأخرى وبعد

إليك برنامج نصي كنت أستخدمه لفترة من الوقت، وقد عملت بشكل جيد للغاية بالنسبة لي في كل بيئة. أنا ببساطة وضعت هذه الوظيفة في ملفي الشخصي الخاص بي. في ~ Documents WindowsPowerShell، وكلما أرغب في إعادة تحميل ملف التعريف الخاص بي، أنا Dot-Source الوظيفة، أي

. Reload-Profile

إليك الوظيفة:

function Reload-Profile {
    @(
        $Profile.AllUsersAllHosts,
        $Profile.AllUsersCurrentHost,
        $Profile.CurrentUserAllHosts,
        $Profile.CurrentUserCurrentHost
    ) | % {
        if(Test-Path $_){
            Write-Verbose "Running $_"
            . $_
        }
    }    
}

نصائح أخرى

إذا كنت ترغب في تحديث ملف التعريف الخاص بك على مستوى العالم من برنامج نصي، فسيتعين عليك تشغيل هذا البرنامج النصي "Dot-Sourced".

عند تشغيل البرنامج النصي الخاص بك، يعمل كل النص النصي الشخصي في نطاق "البرنامج النصي" ولن يقوم بتعديل نطاقك "العالمي".

من أجل النص البرنامجي لتعديل نطاقك العالمي، يجب أن يكون "Dot-Source" مسبقا بفترة.

. ./yourrestartscript.ps1

حيث لديك البرنامج النصي الشخصي "dot-sourced" داخل "yourrestartscript.ps1". ما تفعله فعليا هو سرد "YourrestartScript" للتشغيل في النطاق الحالي وداخل هذا البرنامج النصي، فأنت تخبر البرنامج النصي ببرنامج التعريف $ للتشغيل في نطاق البرنامج النصي. نظرا لأن نطاق البرنامج النصي هو النطاق العالمي، فسوف يحدث أي مجموعة أو أوامر متغيرات في ملف التعريف الخاص بك في النطاق العالمي.

هذا لا يشتري لك الكثير من الاستفادة

. $profile
& $profile   

يعمل على إعادة تحميل الملف الشخصي.

إذا أعطيت ملفك الشخصي على الأسماء المستعارة أو تنفذ الواردات التي تفشل ثم سترى أخطاء لأنها تم تعيينها بالفعل في التحميل السابق للملف الشخصي.

لماذا تحاول القيام بذلك؟

لأنه من المرجح أن ينشئ التكرارات (إلحاق ENV: المسار) والمشاكل المتعلقة بوضع كائنات ثابتة / Readonly التي تسبب أخطاء.

كان هناك موضوع حول هذا الموضوع مؤخرا microsoft.public.windows.powershell..

إذا كنت تحاول إعادة تعيين حالة الجلسة، فلا توجد طريقة للقيام بذلك، حتى باستخدام نطاق داخلي ($host.EnterNestedPrompt()) بسبب القدرة على تعيين المتغيرات / الأسماء المستعارة / ... في "كل نطاق".

لقد وجدت هذا الحل البديل:

#some-script.ps1

#restart profile (open new powershell session)
cmd.exe /c start powershell.exe -c { Set-Location $PWD } -NoExit
Stop-Process -Id $PID

نسخة أكثر وضوحا:

#publish.ps1
# Copy profile files to PowerShell user profile folder and restart PowerShell
# to reflect changes. Try to start from .lnk in the Start Menu or
# fallback to cmd.exe.
# We try the .lnk first because it can have environmental data attached
# to it like fonts, colors, etc.

[System.Reflection.Assembly]::LoadWithPartialName("System.Diagnostics")

$dest = Split-Path $PROFILE -Parent
Copy-Item "*.ps1" $dest -Confirm -Exclude "publish.ps1" 

# 1) Get .lnk to PowerShell
# Locale's Start Menu name?...
$SM = [System.Environment+SpecialFolder]::StartMenu
$CurrentUserStartMenuPath = $([System.Environment]::GetFolderPath($SM))
$StartMenuName = Split-Path $CurrentUserStartMenuPath -Leaf                                 

# Common Start Menu path?...
$CAD = [System.Environment+SpecialFolder]::CommonApplicationData
$allUsersPath = Split-Path $([System.Environment]::GetFolderPath($CAD)) -Parent
$AllUsersStartMenuPath = Join-Path $allUsersPath $StartMenuName

$PSLnkPath = @(Get-ChildItem $AllUsersStartMenuPath, $CurrentUserStartMenuPath `
                                        -Recurse -Include "Windows PowerShell.lnk")

# 2) Restart...
# Is PowerShell available in PATH?
if ( Get-Command "powershell.exe" -ErrorAction SilentlyContinue ) {

    if ($PSLnkPath) {

        $pi = New-Object "System.Diagnostics.ProcessStartInfo"
        $pi.FileName = $PSLnkPath[0]
        $pi.UseShellExecute = $true

        # See "powershell -help" for info on -Command
        $pi.Arguments = "-NoExit -Command Set-Location $PWD"

        [System.Diagnostics.Process]::Start($pi)
    }
    else { 

        # See "powershell -help" for info on -Command
        cmd.exe /c start powershell.exe -Command { Set-Location $PWD } -NoExit
    }
}
else {
    Write-Host -ForegroundColor RED "Powershell not available in PATH."
}

# Let's clean up after ourselves...
Stop-Process -Id $PID

هذا مجرد تحويل النصي السطري في إجابة Guillermooo أعلاه، والتي لم تحصل على نافذة PowerShell الجديدة في الدليل الصحيح بالنسبة لي. أعتقد أن هذا لأن PWD قد يتم تقييمه في سياق نافذة PowerShell الجديد، وهو ليس القيمة التي نريد بها الموقع معالجتها.

function Restart-Ps {
$cline = "`"/c start powershell.exe -noexit -c `"Set-Location '{0}'" -f $PWD.path
cmd $cline
Stop-Process -Id $PID
}

من خلال الحقوق التي لا ينبغي أن تعمل بها، لأن سطر الأوامر التي يبصقها هي مشوهة، ولكن يبدو أن القيام بهذه المهمة وهذا جيد بما فيه الكفاية بالنسبة لي.

استخدمت هذا لاستكشاف ملف التعريف الذي كان يأخذه إلى الأبد لتحميله.

بدء تشغيل:

powershell_ise -noprofile

ثم ركضت هذا:

function Reload-Profile {
    @(
        $Profile.AllUsersAllHosts,
        $Profile.AllUsersCurrentHost,
        $Profile.CurrentUserAllHosts,
        $Profile.CurrentUserCurrentHost
    ) | % {
        if(Test-Path $_){
            Write-Verbose "Running $_"
            $measure = Measure-Command {. $_}
            "$($measure.TotalSeconds) for $_"
        }
    }    
}

. Reload-Profile

شكرا لك

منذ أن تعثرت على هذا بعد عدة سنوات، اعتقدت أن أضيف أنه يمكنك استخدام مشغل الاحتجاج: & لتحميل ملف التعريف الخاص بك مع المتغير الافتراضي إلى ملف التعريف الخاص بك: $profile.

لذلك، إذا فشلت جلستك بطريقة أو بأخرى في تحميل ملف التعريف الخاص بك (يحدث لي مع cmder / conemu) فقط النوع:

& $profile

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top