我安装powershell社区扩展是因为我想对这段代码使用Show-Tree。
# Log project state
# Assumes CWD is the project file
$Tree = Show-Tree -ShowProperty -ShowLeaf | Where-Object {$_ -inotmatch '^.*Property.*' -or $_ -match '^.*LastWriteTime\s.*'}
$i = 0
$culture = [Globalization.CultureInfo]::InvariantCulture
foreach($entry in $Tree){
if($entry -notmatch '^.*Property.*'){
$d = "{0:hh}:{0:mm}:{0:ss}" -f ([DateTime]::Parse($($Tree[$i+1] -replace '^.+=\s(.+)','$1'), $culture))
$Tree[$i] = "$d`t$entry"
}
$i++
}
$Tree = $Tree | Where-Object {$_ -inotmatch '^.*Property.*'}
foreach($s in $Tree){Write-Output $s}这在VS代码中的PS调试会话中工作正常,但是当我尝试在MSBuild或powershell命令提示符中使用它时,它会抱怨它找不到扩展模块.
Show-Tree : The term 'Show-Tree' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At C:\Users\Admin\Documents\GitHub\powershell-scripts\ProjectSnapShot.ps1:6 char:9
+ $Tree = Show-Tree -ShowProperty -ShowLeaf | Where-Object {$_ -inotmat ...
+ ~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Show-Tree:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException我检查了PSModulePath env变量,它指向两个有效的位置,一个是std模块,另一个是pscx模块。

根据医生们的说法,这意味着模块是自动加载的。
一般来说,您可以通过使用存储在$ENV:PSModulePath变量中的一条路径来确定应该在哪里安装模块。使用这些路径之一意味着当用户在代码中调用模块时,PowerShell可以自动查找和加载模块。如果您将模块存储在其他地方,则可以在调用Install时将模块的位置作为参数传递给PowerShell,从而显式地让知道。
如何从PS命令提示符和从MSBuild调用它?
发布于 2017-03-06 16:43:14
假设您在将上面的代码作为脚本运行时遇到了这个问题,那么您可以做很多事情,例如:
如果您只担心机器上运行这个脚本,那么在分配函数Import-Module变量之前,可以传递包含函数Show-Tree的模块文件的显式.psm1路径。
如果您正在寻找更多的可移植性,您可以将定义函数Show-Tree的代码从.psm1模块文件复制到这个脚本中,然后再分配$Tree变量。
如果您想更多地了解为什么会发生这种情况,下面是关于从PowerShell帮助文件about_Scopes继承的部分
继承 子作用域不继承父作用域的变量、别名和函数。除非项目是私有的,否则子范围可以查看父范围中的项。而且,它可以通过显式指定父作用域来更改项,但这些项不是子范围的一部分。 但是,一个子作用域是用一组项创建的。通常,它包括所有具有AllScope选项的别名。此选项将在本主题后面讨论。它包括所有具有AllScope选项的变量,以及一些可用于自定义作用域的变量,如MaximumFunctionCount。
发布于 2017-03-07 06:37:34
重新启动我的电脑后,这个问题就解决了.还有其他一些奇怪的不稳定(新的错误抛出,尽管没有什么改变),也消失后,重新启动。
发布于 2017-03-07 06:56:02
我也观察到了类似的行为。即使GUI显示PSMODULEPATH正常,正在运行的进程(如explorer.exe)也不会自动获取对环境的更改。通常,登录/-打开或重新启动会有所帮助。
背景:当进程启动时,当前环境将被“复制到”流程中。如果进程启动另一个进程,就像使用Windows Explorer启动程序一样,新的子进程将获得父进程环境的副本。因此,除非进程显式地侦听WM_SETTINGSCHANGED窗口消息并作出相应的反应,否则不会通过运行进程来获取对用户或系统环境变量的更改。根据我的经验,没有多少过程能正确地做到这一点。
https://stackoverflow.com/questions/42629918
复制相似问题