PowerShell PSD1文件被限制为"非动态"行为。但是,我注意到可以使用一些自动变量。即$ null,$ true和$ false(有效常量)。他们是其他人吗?是否有关于完全 PSD1文件可以包含的文档。我理解内容是静态PS类型的一个大哈希表,但是什么是"规则"定义什么是"静态" (或常数)关于这些文件。这里有一长串自动变量:https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables但大多数在PSD1上下文中不起作用。例如,为什么要考虑$ PSHOME或$ PID这样的事情"动态"?
考虑:
PS> get-variable true|select *
Name : true
Description : Boolean True
Value : True
Visibility : Public
Module :
ModuleName :
Options : Constant, AllScope
Attributes : {}
PS> get-variable pid|select *
Name : PID
Description : Current process ID
Value : 5056
Visibility : Public
Module :
ModuleName :
Options : Constant, AllScope
Attributes : {}
它们看起来几乎相同,都标记为"常数"但是我可以在PSD1文件中使用,而另一个我可以使用。
答案 0 :(得分:2)
PowerShell模块清单实际上是在RestrictedLanguage
Language Mode中运行的可执行文件。
在RestrictedLanguage语言模式下,用户可以运行命令(cmdlet, 功能,CIM命令和工作流程)但不允许使用 脚本块。
仅允许以下变量:
- $ PSCulture
- $ PSUICulture
- $真
- $假
- $空。
只允许使用以下比较运算符:
- -eq(相等)
- -gt(大于)
- -lt(小于)
分配语句,属性引用和方法调用不是 允许的。
$true
,$false
和$null
来自哪里。允许的内容实际上与静态或常量或只读无关。
您还可以使用$PSScriptRoot
(参考模块的目录)和as of version 5.1 you can use $PSEdition
,它可以让您确定自己是否Desktop
(Windows PowerShell)或Core
(跨平台)。您可以在链接的示例中看到正在使用语言元素(if
语句)。
You can see this happening in PowerShell's source code。请参阅该行后面的LoadModuleManifestData
,查看其首位checks that the manifest contents (scriptblock) conforms to restricted language mode,然后it loads the special variables,最后executes the contents。
答案 1 :(得分:0)
模块清单是包含哈希表的.psd1文件。哈希表中的键和值执行以下操作:
模块不需要清单。模块可以引用脚本文件(.ps1),脚本模块文件(.psm1),清单文件(.psd1),格式和类型文件(.ps1xml),cmdlet和提供程序集(.dll),资源文件,帮助文件,本地化文件,或作为模块一部分捆绑的任何其他类型的文件或资源。对于国际化脚本,模块文件夹还包含一组消息目录文件。如果将清单文件添加到模块文件夹,则可以通过引用清单将多个文件作为单个单元引用。
清单本身描述了以下类别的信息:
有关详细信息,请参阅How to Write a PowerShell Module Manifest。