ここで二重引用符で囲まれた文字列を使用すると、二重引用符で囲まれた通常の文字列のように動作します。パーサは、引用符で囲まれた変数または部分式を評価し展開します。
スクリプトブロック定義内の変数は、すでにあなたは次のように定義されたスクリプトブロックで終わる、定義のコンテキスト内に存在しないので:
= (Get-Item -path D:\Websites\).GetAccessControl('Access')
= New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
.SetAccessRule()
Set-Acl -path -AclObject
あなたが見ることができるように、最初の二つの文が出始めます=
が最初の空白以外の文字として表示され、これが表示されているエラーの原因です。代わりに、単一引用符で囲まれ、ここで文字列に
スイッチ:
$sb = [ScriptBlock]::Create(@'
$Acl = (Get-Item -path D:\Websites\$Sitename).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
$Acl.SetAccessRule($Ar)
Set-Acl -path $Path -AclObject $Acl
'@)
あなたが定義する範囲から変数の値を渡す必要がある場合、私はスクリプトブロックでparam
ブロックを定義するのいずれかをお勧めしたい:
$sb = [ScriptBlock]::Create(@'
param($Sitename)
$Acl = (Get-Item -path D:\Websites\$Sitename).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
$Acl.SetAccessRule($Ar)
Set-Acl -path $Path -AclObject $Acl
'@)
Invoke-Command -Session $Session -ScriptBlock $sb -ArgumentList $Sitename
またはスクリプトブロックを作成する前に、文字列でそれを置き換えるために-f
文字列フォーマット演算子を使用します。
$sb = [ScriptBlock]::Create(@'
$Acl = (Get-Item -path D:\Websites\{0}).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\IIS_IUSRS', 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
$Acl.SetAccessRule($Ar)
Set-Acl -path $Path -AclObject $Acl
'@ -f $Sitename)
勝っ
変更 '@「' @」に「@ '」@'(単一引用符で囲まれたここに文字列ではなく、二重引用符で囲まれた) –
を引用し、変数の展開の詳細については
about_Quoting_Rules
help topicを参照してください。 $ sitename変数がスクリプトブロックに渡されているので、作業を拡張する必要がありますか?私は$ acl、$ ar $ aclと$ path変数を変数として扱う必要がありますが、$ sitename変数を展開しています – Karl私はそれに対応するために私の答えを更新しました。 –