2017-09-05 14 views
1

ここに指定された応答に加えて、Powershell Enter Session find path bug、私は回避できないスクリプトの別の壁にヒットしました。以下のスクリプトはエラーを返します:Powershell "="認識されていないコマンドレットエラー

The term '=' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was 
included, verify that the path is correct and try again. 

$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 
"@) 

Invoke-Command -Session $Session -ScriptBlock $sb 

私はスクリプトブロック変数($ sb)を作成できますが、私が呼び出すとエラーが発生します。私はそれを$ Acl変数の設定に絞り込み、さまざまな方法を書き直してみました。私は何が欠けていますか?

+1

変更 '@「' @」に「@ '」@'(単一引用符で囲まれたここに文字列ではなく、二重引用符で囲まれた) –

+0

を引用し、変数の展開の詳細についてはabout_Quoting_Rules help topicを参照してください。 $ sitename変数がスクリプトブロックに渡されているので、作業を拡張する必要がありますか?私は$ acl、$ ar $ aclと$ path変数を変数として扱う必要がありますが、$ sitename変数を展開しています – Karl

+0

私はそれに対応するために私の答えを更新しました。 –

答えて

2

ここで二重引用符で囲まれた文字列を使用すると、二重引用符で囲まれた通常の文字列のように動作します。パーサは、引用符で囲まれた変数または部分式を評価し展開します。

スクリプトブロック定義内の変数は、すでにあなたは次のように定義されたスクリプトブロックで終わる、定義のコンテキスト内に存在しないので:

= (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) 

勝っ

+0

それは完璧に働いています、ありがとうございました。私は-fスイッチを認識していませんでした – Karl

+2

@Karl今後googleの場合は、フォーマットオペレータと呼ばれています。 – TheIncorrigible1

関連する問題