在PowerShell中有条件地指定开关参数

16

我正在编写一个 PowerShell 脚本,使用 SharePoint 2010 的 New-SPWeb cmdlet 来创建由 XML 文件定义的站点:

<?xml version="1.0" encoding="utf-8" ?>
<siteStructure>
  <site>
    <url>Corporate</url>
    <name>Corporate</name>
    <language>1033</language>
    <addToQuickLaunch>0</addToQuickLaunch>
    <addToTopNav>0</addToTopNav>
    <useParentTopNav>1</useParentTopNav>
  </site>
</siteStructure>

New-SPWeb命令有三个开关参数:

  1. AddToQuickLaunch
  2. AddToTopNav
  3. UseParentTopNav

我不知道如何在Xml匹配值为0或$true时仅设置开关参数。

这就像我需要某种内联-if语法来调用New-SPWeb以设置三个开关参数。

$siteStructureData = [xml](Get-Content .\Data-SiteStructure.xml)

# find the template to use
$webTemplate = Get-SPWebTemplate | Where {$_.Title -like $templateName } 

if ($webTemplate)
{
    # iterate through and create sites
    foreach ($siteToCreate in $siteStructureData.siteStructure.site)
    {   
        "Creating site $webtitle at $URL/$webUrl"

        # http://technet.microsoft.com/en-us/library/ff607579.aspx
        New-SPWeb `
            -Url "$URL/$siteToCreate.url" `
            -Name $siteToCreate.name `
            -Template $webTemplate `
            -Language $siteToCreate.language 
            # set -AddToQuickLaunch
            # set -AddToTopNav
            # set -UseParentTopNav
    }
}
else
{
    throw ("Could not find template $templateName");
}

非常感谢!


哇!我正在做完全相同的事情!只是晚了将近两年。 - Andez
2个回答

25

在执行前计算$result$true$false):

$result = ...

然后在使用它:

New-SPWeb `
-Url "$URL/$siteToCreate.url" `
-Name $siteToCreate.name `
-Template $webTemplate `
-Language $siteToCreate.language `
-AddToQuickLaunch:$result `
-AddToTopNav:$result `
-UseParentTopNav:$result

谢谢,Roman。我不知道 switch 参数的那种语法。 - George Durzi
是的,发现问题并不容易... 很久以前我也遇到过这样的问题。 - Roman Kuzmin
谢谢...刚刚在PowerGUI中发现,如果在参数后面加上冒号,智能感知会让你知道你可以指定$true或$false。 - Andez

25

还有一种方法。您可以像这样使用splatting:

$params = @{
            Url = "$URL/$siteToCreate.url"
            Name = $siteToCreate.name
            Template = $webTemplate 
            Language = $siteToCreate.language }
# if needed, add the keys to the hashtable
if ($result) {
    $params.AddToQuickLaunch = $true
    $params.AddToTopNav = $true
    $params.UseParentTopNav = $true
}
# now you just pass the parameters:
New-SPWeb @params

更多有关 splatting 的内容:

在 Powershell 中,符号“@”代表什么意思? 如何使用 splatting 传递开关参数以及为什么要使用它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接