2014-02-28 138 views
1

我創建一個動態腳本塊下面,所以我可以使用本地函數和變量,並很容易地通過調用命令將它們傳遞到遠程計算機的方式。問題是,由於Create內部的所有文本都用雙引號括起來,所以我放棄了所有的語法高亮,因爲所有編輯器都將代碼視爲一個大字符串。Synax高亮W /動態腳本塊

雖然這只是一個表面問題,我想找到一個解決辦法,讓我的代碼,而無需雙引號進行傳遞。我試過在Create中傳遞一個變量,而不是實際的文本,但它不會被解釋。

function local_admin($a, $b) { 
([adsi]"WinNT://localhost/Administrators,group").Add("WinNT://$a/$b,user") 
} 

$SB = [ScriptBlock]::Create(@" 

    #Define Function 
    function local_admin {$Function:local_admin} 

    local_admin domain username 
"@) 


Invoke-Command -ComputerName server2 -ScriptBlock $SB 

回答

0

您可以使用以下示例將該函數傳遞到遠程會話中。這使您可以使用大括號而不是字符串來定義ScriptBlock

# Define the function 
function foo { 
    "bar"; 
} 

$sb = { 
    # Import the function definition into the remote session 
    [void](New-Item -Path $args[0].PSPath -Value $args[0].Definition); 
    # Call the function 
    foo; 
    }; 

#(gi function:foo) | select * 
Invoke-Command -ComputerName . -ScriptBlock $sb -ArgumentList (Get-Item -Path function:foo); 

這是您的功能的修改版本。使用-ArgumentList參數請注意的是,域和用戶名可以被動態地傳遞到遠程ScriptBlock。我正在使用$args自動變量將對象傳入ScriptBlock

function local_admin($a, $b) { 
    ([adsi]"WinNT://localhost/Administrators,group").Add("WinNT://$a/$b,user") 
} 

$SB = { 
    #Define Function 
    [void](New-Item -Path $args[0].PSPath -Value $args[0].Definition); 
    # Call the function 
    local_admin $args[1] $args[2]; 
} 

Invoke-Command -ComputerName server2 -ScriptBlock $SB -ArgumentList (Get-Item -Path function:local_admin), 'domain', 'username'; 
+0

如果我這樣做,輸出就是: $功能:local_admin「代碼」 功能是從來沒有實際運行。 – RogeR

+0

我更新了我的答案 - 抱歉,我最初誤解了您的問題。 –

+0

這工作表示感謝!我的確有點像[ScriptBlock] :: Create方法,因爲它可以讀取所有局部變量,而無需在ArgumentList中聲明它們。 任何想法上這是更好的方法? – RogeR