2017-01-27 4 views
0

Я хочу создать набор псевдонимов в файле, который я могу обновить, а затем вызвать псевдоним aa, чтобы файл выполнялся, и мне предоставлены новые псевдонимы в текущем сеансе. В конце концов, я хотел, чтобы эти псевдонимы доступны автоматически при запуске PS поэтому я использую C:\Users\Administrator\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1, чтобы поместить их в данный момент он выглядит следующим образом:.

$psdir="C:\Users\Administrator\Documents\WindowsPowerShell" 

function Reload-Profile{ 
    # . ${profile} DOES NOT WORK 
    # Write-Host ${profile} 
    # Write-Host $profile 
    # powershell $profile DOES NOT WORK  
    # Get-ChildItem "${psdir}\*.ps1" | %{.$_} DOES NOT WORK 
    Write-Host "Custom PowerShell Environment Loaded" 
} 
function Edit-Profile 
{ 
    powershell_ise.exe $profile 
} 
Set-Alias show Get-ChildItem 
Set-Alias show2 Get-ChildItem 
Set-Alias aa Reload-Profile 
Set-Alias ep Edit-Profile 

Как я могу сделать это так, что псевдонимы загружаются при запуске, но я могу также обновить их с помощью псевдонима aa и включить их в текущую сессию?

+0

'Add-Type 'using System.Management.Automation; используя System.Management.Automation.Runspaces; [Cmdlet («Reload», «Profile»)] public class ReloadProfileCmdlet: PSCmdlet {protected override void EndProcessing() {InvokeCommand.InvokeScript (". $ Profile", false, PipelineResultTypes.Output | PipelineResultTypes.Error, null); }} '-PassThru | Выбрать -Первая 1 -ExpandProperty Assembly | Import-Module; Set-Alias ​​aa Reload-Profile' – PetSerAl

+0

@PetSerAl Неудивительно, что я не мог понять это. Спасибо! –

ответ

0

Если оригинал автора комментария, который содержит следующий код, решает опубликовать его в качестве ответа, просто добавьте комментарий к этому ответу, и я удалю его. Как и два дня, я не ожидаю его. Между тем это должно дать людям лучшее представление о том, что на самом деле происходит.

# https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/add-type 
# Create a new cmdlet Reload-Profile using C# code and import it 
Add-Type ' 
using System.Management.Automation; 
using System.Management.Automation.Runspaces; 

// https://msdn.microsoft.com/en-us/library/dd878294(v=vs.85).aspx 
[Cmdlet("Reload", "Profile")] 
public class ReloadProfileCmdlet : PSCmdlet { 
    protected override void EndProcessing() 
    { 
     // https://msdn.microsoft.com/en-us/library/ms568378(v=vs.85).aspx 
     // Runs $profile without parameters in the current context and displays the output and error 
     InvokeCommand.InvokeScript(". $profile", false, PipelineResultTypes.Output | PipelineResultTypes.Error, null); 
    } 
}' -PassThru | Select -First 1 -ExpandProperty Assembly | Import-Module; 
# Setup an alias for the new cmdlet 
Set-Alias aa Reload-Profile 

Для лучшей читаемости/подсветка C# код автономно:

using System.Management.Automation; 
using System.Management.Automation.Runspaces; 

// https://msdn.microsoft.com/en-us/library/dd878294(v=vs.85).aspx 
[Cmdlet("Reload", "Profile")] 
public class ReloadProfileCmdlet : PSCmdlet { 
    protected override void EndProcessing() 
    { 
     // https://msdn.microsoft.com/en-us/library/ms568378(v=vs.85).aspx 
     // Runs $profile without parameters in the current context and displays the output and error 
     InvokeCommand.InvokeScript(". $profile", false, PipelineResultTypes.Output | PipelineResultTypes.Error, null); 
    } 
} 
0

Проблема с кодом является, что Reload-Profile является функцией и при вызове, он будет создавать новые возможности для себя. Когда вы затем вызываете . $profile, он не будет создавать новую область для профиля, но он все равно вызывается внутри области Reload-Profile. Таким образом, когда заканчивается Reload-Profile, область действия будет отброшена. Таким образом, вам нужно вызвать Reload-Profile с оператором dot invoke: . Reload-Profile или . aa, если вы используете псевдоним.

Я предполагаю, что ваш реальный вопрос: «Как сделать команду aa так, чтобы не использовать оператор dot invoke?»

Ответ будет заключаться в использовании скомпилированного командлета вместо функции PowerShell, поскольку PowerShell не создает новую область для вызова командлета. Затем этот командлет может вызвать . $profile в текущей области.

Add-Type @‘ 
    using System.Management.Automation; 
    using System.Management.Automation.Runspaces; 
    [Cmdlet("Reload", "Profile")] 
    public class ReloadProfileCmdlet : PSCmdlet { 
     protected override void EndProcessing() { 
      InvokeCommand.InvokeScript(
       ". $profile", 
       false, 
       PipelineResultTypes.Output | PipelineResultTypes.Error, 
       null 
      ); 
     } 
    } 
’@ -PassThru | Select -First 1 -ExpandProperty Assembly | Import-Module 
Set-Alias aa Reload-Profile 

P.S.
Я рекомендую использовать другой глагол вместо Reload, потому что Reload не включен в список рекомендуемых глаголов, поэтому Import-Module выдаст предупреждение, когда вы импортируете Reload-Profile в свою сессию.

Смежные вопросы