如何获取远程执行的脚本以了解它自己的位置?我使用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 :(得分:2)
将-FilePath
与Invoke-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
答案 1 :(得分:1)
在尝试了一些提议的更改后,我开始明白Invoke-Command实际上并没有在其原始位置运行远程脚本,而是从原始位置加载它然后在上下文中运行它PowerShell作为运行本地脚本的用户。 “脚本目录”实际上是用户工作空间中的一个目录,无论脚本最初的位置如何。
这在某种程度上为我澄清了一些事情。虽然可能有方法来判断脚本最初来自哪里或实际在远程服务器上启动会话然后在那里运行脚本作为“本地”脚本,需要远程脚本进一步访问其他服务器,创建多个跃点在身份验证中,意味着我必须添加CredSSP。
似乎我原来的计划,传递我用来定位脚本到脚本的路径,以便它可以将输出文件放在原始目录中,这可能是最好的方法,因为我还必须将CredSSP添加到混合。
我愿意反驳,但我不认为任何提议的解决方案实际上改进了远程脚本的功能,因此我将坚持我现在开始使用的内容。感谢大家的贡献。
答案 2 :(得分: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]}