如何在PowerShell中继续使用脚本块?

时间:2016-06-03 18:17:16

标签: powershell

我尝试编写Powershell函数来创建OrganizationalUnit。我是一名PS新手,但我已拼凑在一起:

function makeOU ($cn, $path)
{
  $sb = [scriptblock]::Create(
      "New-ADOrganizationalUnit $cn -path `"$path`"
        -ProtectedFromAccidentalDeletion 0"
    )

  Invoke-Command -ComputerName $server -Credential $Credential `
    -ScriptBlock $sb
}

但是当我稍后在脚本中调用它时,我收到一条消息-ProtectedFromAccidentalDeletion是一个未知的cmdlet。如果我命令一行

"New-ADOrganizationalUnit $cn -path `"$path`" -ProtectedFromAccidentalDeletion 0"

它有效。

我认为,在

结束时
      "New-ADOrganizationalUnit $cn -path `"$path`"

有一个开括号和一个开放的引号,所以PS应该寻找更多的输入。用后退结束这条线并没有帮助。也没有将论据转换为Create()形式@" ... "@。 (这与Why I am getting PowerShell Parsing Error?不同,因为我没有任何后退,当然也没有后面的空格。)

如果我在这里制作新手错误,并且有更好的方法将函数参数传递给Invoke-Command,我可以重写但是如果没有,那怎么能打破字符串传递给Create()到多行?

3 个答案:

答案 0 :(得分:2)

好吧,如果您真的想以这种方式进行格式化,请尝试以下方法:

function makeOU ($cn, $path)
{
  $sb = [scriptblock]::Create(
      "New-ADOrganizationalUnit $cn -path (
        `"$path`"
       ) -ProtectedFromAccidentalDeletion 0"
    )

  Invoke-Command -ComputerName $server -Credential $Credential `
    -ScriptBlock $sb
}

答案 1 :(得分:2)

如果您知道如何逃避内部"双引号,并且知道如何使用在多行上传播命令Grave Accent 作为逃脱角色:

  Invoke-Command -ComputerName $server -Credential $Credential `
    -ScriptBlock $sb

然后你知道如何在脚本块中执行最后操作:只需加倍 Grave Accent 字符:

  $sb = [scriptblock]::Create(
      "New-ADOrganizationalUnit $cn -path `"$path`" ``
        -ProtectedFromAccidentalDeletion 0"
    )

答案 2 :(得分:1)

  

克里斯·尼尔森:你的“如果你真的想”会让我听起来像是在做某事   绝对反对PS的情感。我非常愿意相信这一点   我想知道你是怎么写的。

事情是,Posh community

中的反引号令人不悦
  

一般来说,社区认为你应该避免使用这些反对   尽可能作为“续行字符”。他们很难读,   容易错过,容易输入错误。此外,如果您添加额外的   在上面的例子中反引用之后的空格,然后是命令   不行。产生的错误很难与实际相关联   问题,使调试问题更难。

  

避免长线的首选方法是使用喷溅(参见   About_Splatting)和PowerShell隐含的内线延续   括号,括号和大括号 - 这些应始终用于   在适用的情况下,甚至可以优先选择反引号   对于字符串

既然你已经问过我是怎么写的,这里有一些例子:

“结构化”

function makeOU ($cn, $path)
{
    $Template = 'New-ADOrganizationalUnit {0} -Path "{1}" -ProtectedFromAccidentalDeletion 0'
    $ScriptBlock = [scriptblock]::Create(($Template -f $cn, $path))

    Invoke-Command -ComputerName $server -Credential $Credential -ScriptBlock $ScriptBlock
}

“Splatted”

function makeOU ($cn, $path)
{
    $Template = 'New-ADOrganizationalUnit {0} -Path "{1}" -ProtectedFromAccidentalDeletion 0'
    $ScriptBlock = $Template -f $cn, $path

    $Splat = @{
        ComputerName = $server
        Credential = $Credential
        ScriptBlock = [scriptblock]::Create($ScriptBlock)
    }

    Invoke-Command @Splat
}

“Oneliner”

function makeOU ($cn, $path)
{
    Invoke-Command -ComputerName $server -Credential $Credential -ScriptBlock (
        [scriptblock]::Create(
            ('New-ADOrganizationalUnit {0} -Path "{1}" -ProtectedFromAccidentalDeletion 0' -f $cn, $path)
        )
    )
}

# Or, using parentheses:

function makeOU ($cn, $path)
{
    Invoke-Command -ComputerName (
        $server
    ) -Credential (
        $Credential
    ) -ScriptBlock (
        [scriptblock]::Create(
            ('New-ADOrganizationalUnit {0} -Path "{1}" -ProtectedFromAccidentalDeletion 0' -f $cn, $path)
        )
    )
}