2016-02-15 72 views
2

我如何獲得一個遠程執行的腳本來知道它的位置?我正在使用Invoke-Command在遠程服務器上運行腳本。該腳本需要在其所在的目錄中創建文件。使用相對尋址運行不起作用(即。\ output.log),腳本通常會在遠程服務器上的用戶配置文件中結束。我嘗試了this question中列出的所有方法,但當腳本很偏遠時,它們都不起作用。遠程執行腳本的腳本位置?

更新:每個請求

 
$server='ad1hfdahp802' 
$remotepath='\\ad1hfdahp802\d$\AHP\pi_exceed_presentation\pi_exceed_presentation_deploy.ps1' 
$SDFEnvironment='INT' 
Invoke-Command -ComputerName $server -FilePath $remotepath -ArgumentList($SDFEnvironment,$remotepath) 

遠程腳本會從$ remotepath,並把它變成一個文件系統路徑提供的腳本調用代碼。

+0

在這種情況下,你想'D:\ AHP \ pi_exceed_presentation \'? – pvoosten

+0

是的。我希望腳本能夠確定它實際駐留的位置。 –

回答

2

使用-FilePathInvoke-Command表示您在本地讀取腳本並將內容作爲腳本塊發送到遠程計算機。 $PSScriptRoot只有在腳本直接在目標上執行時纔有效。你可以嘗試使用:

Invoke-Command - ComputerName "computer1" -Scriptblock { & '\\server\path\to\script.ps1' } -Authentication Credssp 

要知道,你需要的CredSSP,使這項工作,因爲遠程計算機無法使用您的憑據,沒有它訪問網絡資源。作爲替代,您可以使用psexec(或遠程啓動進程)。防爆。

psexec \\computer1 powershell -noprofile -file \\server\path\to\script.ps1 
+0

該腳本已存在於遠程服務器上。我通過UNC路徑引用它。我的解決方法是,我知道UNC路徑,我可以計算文件系統路徑並將其作爲參數傳遞,但我希望能夠從遠程服務器上運行的上下文計算它,而不是將其傳入。 .. –

+0

'$ psscriptroot'不起作用(ps3.0或更新版本)?你需要提供一個你如何使用'invoke-command'的示例,因爲這個不清楚。 –

+0

使用運行Invoke-Command的腳本更新原始帖子。 –

0

在遠程服務器上輸入一個會話,然後從那裏調用腳本。

local PS> Enter-PSSession -ComputerName $server ... 
remote PS> powershell d:\AHP\...\script.ps1 
remote PS> exit 
local PS> 

然後你就可以在腳本中使用$PSScriptRoot在遠程服務器中獲取遠程服務器上的腳本目錄的本地路徑。


編輯:

要找到腳本在遠程服務器上,你可以用你的腳本文件的網絡路徑的知識,並解析的net share輸出到網絡路徑映射到本地路徑遠程服務器。

remote PS> net share | where { $_.StartsWith('D$ ') } | foreach { [regex]::Split($_, " +")[1]} 
1

努力後的一些變化提出的,我認識到,在調用命令實際上並沒有運行遠程腳本在原來的位置,而是從原來的位置加載它,然後運行它在PowerShell的上下文中作爲運行本地腳本的用戶。 「腳本目錄」實際上是用戶工作區中的一個目錄,而不管腳本原來的位置。

這對我來說有點澄清。雖然可能有許多方法可以用來預測腳本最初來自哪裏或實際在遠程服務器上啓動會話,然後在該處運行腳本作爲「本地」腳本,但需要遠程腳本進一步訪問其他服務器,創建多個躍點在身份驗證中,意味着我必須將CredSSP添加到組合中。

看起來我的原始計劃,要傳遞我用來查找腳本到腳本的路徑,以便它可以將輸出文件放在原始目錄中,可能是最好的方法,因爲我還必須將CredSSP添加到混合。

我願意反駁,但我不認爲任何提議的解決方案實際上都會改進遠程腳本的功能,所以我將堅持我現在開始使用的方法。感謝大家的貢獻。