如何重新创建PowerShell $ profile变量?它在自定义主机中为空

时间:2016-03-26 18:16:37

标签: c# powershell

如果使用System.Management.Automation(SMA)实现自定义PowerShell主机,则所有自动变量都是可用的,除非$PROFILE似乎为空。怎么会重新创造呢?

它始终在UserProfile + \Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1吗?或者我是否需要担心它在其他地方?

澄清一下,我只关心CurrentUserCurrentHost个人资料。

详细信息

鉴于此PowerShell脚本:

Write-Output "_Profiles_" 
Write-Output "CurrentUserCurrentHost = '$($Profile.CurrentUserCurrentHost)'"
Write-Output "CurrentUserAllHosts = '$($Profile.CurrentUserAllHosts)'"
Write-Output "AllUsersCurrentHost = '$($Profile.AllUsersCurrentHost)'"
Write-Output "AllUsersAllHosts = '$($Profile.AllUsersAllHosts)'"

针对系统PowerShell运行它具有以下输出:

_Profiles_
CurrentUserCurrentHost = 'C:\Users\rob\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1'
CurrentUserAllHosts = 'C:\User\rob\Documents\WindowsPowerShell\profile.ps1'
AllUsersCurrentHost = 'C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1'
AllUsersAllHosts = 'C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1'

使用自定义C#PowerShell主机(System.Management.Automation.Host.PSHost实现)运行它显示:

_Profiles_
CurrentUserCurrentHost = ''
CurrentUserAllHosts = ''
AllUsersCurrentHost = ''
AllUsersAllHosts = ''

背景

https://github.com/chocolatey/choco/issues/667

这已经在PowerShell v3 / System.Managment.Automation(SMA)v3中进行了测试,但很容易在其他PowerShell版本中得到证明。

1 个答案:

答案 0 :(得分:1)

作为一种可能的解决办法,这就是我所提出的。但是,它确实意味着$profile总是应该在Documents文件夹中。

var documentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments, Environment.SpecialFolderOption.DoNotVerify);
var currentUserCurrentHostProfile = _fileSystem.combine_paths(documentsFolder, "WindowsPowerShell\\Microsoft.PowerShell_profile.ps1");

var profileFix = @"
if ((Test-Path(""{0}"")) -and ($profile -eq $null -or $profile -eq '')) {{
  $global:profile = ""{1}""
}}
".format_with(documentsFolder, currentUserCurrentHostProfile);

pipeline.Commands.Add(new Command(profileFix, isScript: true, useLocalScope: false));

这是通过这种方式完成的,因为像LocalSystem这样没有配置​​文件夹的特殊帐户。

注意.format_with是一个字符串格式化工具,因此您看到的{{}}将转换为{和{{1}当它完成字符串格式化时。