将数据传递给powershell脚本

时间:2014-08-05 00:51:41

标签: xml json powershell powershell-v2.0

我正在使用PowerShell脚本,该脚本需要从文件中获取数据并将其用作写入其中的函数的参数。基本上我正在寻找的是JSON或XML文件,但我不确定要使用什么。

我正在寻找的是相对容易使用的,传递数据类型或对象而不是字符串。

数据的一部分在XML中看起来像这样:

<RegistryEntriesList>
<registryPath>HKLM:\\Software\\Lenovo\\Configuration\\</registryPath> <registryProperty>PATH </registryProperty>
<registryPath>HKLM:\\Software\\Lenovo\\Configuration\\</registryPath> <registryProperty>LOGS </registryProperty>
<registryPath>HKLM:\\Software\\Lenovo\\Connections\\</registryPath> <registryProperty>MinConnectionsPerTarget</registryProperty>
<registryPath>HKLM:\\Software\\Lenovo\\Connections\\</registryPath> <registryProperty>MaxWorkingIscsiConnections</registryProperty>
<registryPath>HKLM:\\Software\\Lenovo\\Connections\\</registryPath> <registryProperty>WaitIntervalInMilliseconds</registryProperty>

另一部分在JSON中会喜欢这个:

"entredInput":[{"title":"Powershell","desc":"first"},
      {"title":"json","desc":"third"},
      {"title":"Configfile","desc":"second"}]

还有更多像这样的人。

基本上我会将这些用于自动化目的。我知道PowerShell4.0本身就有cmdlet ConvertFrom-JSON,但它在PS2.0上工作,我希望我的脚本可以在任何版本的PowerShell上运行,即任何版本的Windows。所以我猜XML可能是更好的选择,但我不确定。还有其他选择??

我已经浏览了很多关于JSON与XML的网页链接,他们只是让我很困惑。请让我在JSON,XML和SOMETHINGELSE中选择一个更好的选项。谢谢你回答这个问题。

1 个答案:

答案 0 :(得分:0)

对于PowerShell 2.0,您可能希望使用XML。对于支持JSON的任何东西,我都会使用它:它通常更轻量级。

替代方法是将psd1文件与Import-LocalizedData cmdlet一起使用。假设您在当前文件夹中创建文件'Data.psd1',如下所示:

@{
    RegistryEntriesList = @(
        @{
            registryPath = 'HKLM:\Software\Lenovo\Configuration\'
            registryProperty = 'PATH'
        },
        @{
            registryPath = 'HKLM:\Software\Lenovo\Configuration\'
            registryProperty = 'LOGS'
        }
    )
}

正如您所看到的那样,它是具有单个键RegistryEntriesList的哈希表。它的值是可用于splatting的哈希表的集合。 您可以导入此数据并传递给您的命令,如下所示:

# Our test command...

function New-RegistryEntry {
param (
    [string]$RegistryProperty,
    [string]$RegistryPath
)

    "Got RegistryPath: $RegistryPath and RegistryProperty: $RegistryProperty"
}

Import-LocalizedData -BindingVariable Params -BaseDirectory . -FileName Data.psd1

foreach ($item in $Params.RegistryEntriesList) {
    New-RegistryEntry @item
}