2017-06-20 26 views
1

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那样被认为是“动态的”?psd1文件中可用的PowerShell变量

考虑:

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文件使用,其他的我不能。

回答

1

的PowerShell模块舱单实际上是在一个RestrictedLanguage Language Mode运行可执行文件。

在RestrictedLanguage语言模式下,用户可运行命令(cmdlet的, 功能,CIM命令,和工作流),但不允许使用 脚本块。

只有下列变量是允许的:

  • $ PSCulture
  • $ PSUICulture
  • $真
  • $假
  • $空。

只有下列比较运算符允许:

  • 当量(等于)
  • -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

0

模块舱单

甲模块清单是包含一个哈希表的.psd1文件。哈希表中的键和值执行以下操作:

  • 描述模块的内容和属性。
  • 定义先决条件。
  • 确定如何处理组件。

模块不需要清单。模块可以引用脚本文件(.ps1),脚本模块文件(.psm1),清单文件(.psd1),格式和类型文件(.ps1xml),cmdlet和提供程序集(.dll),资源文件,帮助文件,本地化文件或捆绑在模块中的任何其他类型的文件或资源。对于国际化脚本,模块文件夹还包含一组消息目录文件。如果将清单文件添加到模块文件夹中,则可以通过引用清单来将多个文件作为单个单元引用。

清单本身描述的信息以下几类:

  • 有关的元数据模块,比如模块的版本号,作者,和描述。
  • 导入模块所需的先决条件,例如Windows PowerShell版本,公共语言运行库(CLR)版本和所需的模块。
  • 处理指令,例如要处理的脚本,格式和类型。
  • 限制要导出的模块成员,例如要导出的别名,函数,变量和cmdlet。

欲了解更多信息,请参阅How to Write a PowerShell Module Manifest

Source

+0

谢谢。所有这一切都是真实的,但并不是我所要求的。 PSD1文件也可以包含任意数据,并且可以包含所给链接的“模块清单元素”中没有具体说明的条目。 – Dweeberly

+0

@Dweeberly我无法找到任何有关特定自动变量或“动态”行为的文档。如果你有时间,我会建议全部尝试并过滤出错 – TheIncorrigible1