2014-02-17 203 views
1

本地和遠程機器都啓用了PSSession。我的本地PowerShell腳本如何調用遠程PowerShell腳本?

我想我的問題是,我不知道如何將傳入的字符串轉換爲ScriptBlock以供Invoke-Command使用。我可以使用Enter-PSSession在交互式會話中調用所有這些命令。

我的本地腳本在腳本塊中調用遠程腳本。我通過文件名和路徑在命令行中使用本地

& -p」 \ CallRemote.ps1' 。 「E:\ DeployFolder \腳本\」 -f 「hello.ps1」

本地腳本看起來像這樣

Param(
[parameter(Mandatory=$true)] 
[alias("p")] 
$ScriptPath, 
[parameter(Mandatory=$true)] 
[alias("f")] 
$Scriptfile) 
if ($ScriptPath[$ScriptPath.Length - 1] -eq '\') 
{ 
    $ScriptBlock = $ScriptPath + $Scriptfile 
} 
else 
{ 
    $ScriptBlock = $ScriptPath + '\' + $Scriptfile 
} 
$appserver = "someurl.com" 

$pw = convertto-securestring -AsPlainText -Force -String "password" 
$cred = new-object -typename System.Management.Automation.PSCredential -$argumentlist "domain\svc.account",$pw 

#initiate remote session for deployment 
$session = New-PSSession -ComputerName $appserver -Credential $cred -Name test_remote 

#call remote script 
Invoke-Command -Session $session -ScriptBlock { $ScriptBlock} 
Remove-PSSession -Name test_remote 

如果我硬編碼路徑和文件名前面加上一個「&」它的工作原理。我發現沒有辦法讓這個工作沒有硬編碼。

這種特殊的硬編碼工作 Invoke-Command -Session $session -ScriptBlock { & "E:\DeployFolder\Scripts\hello.ps1"}

這些嘗試在改變進字符串的文件和路徑悄悄地失敗,調用命令-Session $會議-ScriptBlock {$腳本塊}

  1. $腳本塊= 「& '」 + $了ScriptPath + '\' + $腳本文件+ 「''」
  2. $腳本塊= 「& ' " + $ScriptPath + '\' + $Scriptfile + "「」
  3. $腳本塊=「$了ScriptPath + '\' + $腳本文件

這只是失敗右出 Invoke-Command -Session $session -ScriptBlock { & $ScriptBlock} 與錯誤消息:在管道元件

表達後 '&' 產生一個無效的 對象。它必須導致命令名稱,腳本塊或CommandInfo對象。 + CategoryInfo:InvalidOperation:(:) [],的RuntimeException + FullyQualifiedErrorId:BadExpression

回答

0

可以通過使用靜態Create()方法創建從一個StringScriptBlock

$ScriptPath = 'c:\test'; 
$ScriptFile = 'test.ps1'; 
$ScriptBlock = [ScriptBlock]::Create("$ScriptPath\$ScriptFile"); 
... 
... 

的另一個問題我跟你想做什麼看到的是,您使用的是你發送到遠程計算機的ScriptBlock內的$ScriptBlock變量。除非該變量在其他地方被定義,否則您將無法以這種方式傳遞參數。您將需要使用$args自動變量。

# This file must exist on the remote filesystem 
$ScriptFile = 'c:\test\test.ps1'; 
# Invoke the script file on the remote system 
Invoke-Command -Session $Session -ScriptBlock { & $args[0]; } -ArgumentList $ScriptFile; 
+0

這太安靜地失敗了。 – Blanthor

+0

@Blanthor:更新後 - 我想我看到你的變量範圍有問題。 –

+0

我是Powershell的新手我嘗試聲明var $ ScriptBlock並引發異常。 – Blanthor