如果使用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版本中得到证明。
答案 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}当它完成字符串格式化时。