我尝试编写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()
到多行?
答案 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
}
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
}
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)
)
)
}