如何在Powershell中正确组合功能

时间:2019-03-17 04:28:06

标签: powershell session powershell-remoting

对于如何使用PSSession将此EXE推送到远程PC上,我已经进行了大量研究,当逐行执行时,所有代码行都可以工作。但是我很难将其放入一个有意义的函数中,它将执行所有代码行,并且只需按一下按钮就可以成功安装该软件。不知道发生了什么。当我尝试将所有代码行放入函数中并运行它时,它将在本地安装exe。能否请您指导我做错了什么?抱歉,我是Powershell的新手。

  $dc1 = New-PSSession -ComputerName DC1
  Copy-Item C:\TPAdmin\Greenshot-INSTALLER-1.2.10.6-RELEASE.exe -Destination C:\TPAdmin -ToSession $dc1
  Enter-PSSession -Session $dc1
  Invoke-Command -ScriptBlock {C:\TPAdmin\Greenshot-INSTALLER-1.2.10.6-RELEASE.exe /VERYSILENT /LOG="C:\SOFTWAREINSTALL.LOG" 
 Remove-Pssession $dc1

2 个答案:

答案 0 :(得分:0)

至于……

  

对不起,我是Powershell的新手。

...很好,因为我们所有人都必须从某个地方开始。但是...这里有几件事:

  • 请务必设置您的帖子格式,以鼓励人们愿意 救命。人们不赞成这样做。必须复制,粘贴并 重新格式化您的帖子很好,不需要其他多余的工作。 ;-} 。我们去过那里。

  • 我们不知道您如何在PowerShell上快速入门,但是 使用免费的资源来限制/避免所有 误解,沮丧,错误,潜在的不良习惯等, 你将要遇到的。继续观看以下视频:

  • YouTube

  • Microsoft Virtual Academy
  • MSDN Channel9
  • Microsoft Learn
  • 以及reference
  • eBook资源。

回到您的用例。你不说发生了什么事。所以,您让我们猜测。这实际上对您没有潜在的帮助。

尽管如此,您只需要在PowerShell v5x中执行此操作,因为它需要使用-ToSession参数。

$DC1 = New-PSSession -ComputerName 'DC1'
Copy-Item -ToSession $DC1 -Path 'C:\TPAdmin\Greenshot-INSTALLER-1.2.10.6-RELEASE.exe' -Destination 'C:\TPAdmin'
Invoke-Command -Session $DC1 -ScriptBlock {C:\TPAdmin\Greenshot-INSTALLER-1.2.10.6-RELEASE.exe /VERYSILENT /LOG="C:\SOFTWAREINSTALL.LOG"}
Remove-PSSession -Session $DC1

我不确定您为什么要在Enter-PSSsssion命令中执行New-PSSession,因为它不是必需的。用于独立的交互式会话。

Explicit PSRemoting = Enter=PSSEssion

Implicit PSREmoting = New-PSSEssion

如果通过会话在副本上对您来说所有其他操作都失败了,那么只需使用普通的UNC方式即可从源复制到目标。

Copy-Item -Path 'C:\temp\Results.csv' -Destination "\\$($DC1.Computername)\c$\temp"

另请参阅: Copy To or From a PowerShell Session

答案 1 :(得分:0)

Enter-PSSession仅用于 interactive ,因此不适合用于 function [1]

将您使用Enter-PSSession创建的会话传递给New-Session命令的Invoke-Command参数,而不是使用-Session 该命令(在远程会话中)。

# Define your function...
function Invoke-InstallerRemotely {
  param([string] $ComputerName)
  $session = New-PSSession -ComputerName $ComputerName
  Copy-Item C:\TPAdmin\Greenshot-INSTALLER-1.2.10.6-RELEASE.exe -Destination C:\TPAdmin -ToSession $session
  # Do NOT use Enter-PSSession.
  # Pass your session to Invoke-Command with -Session
  Invoke-Command -Session $session -ScriptBlock {C:\TPAdmin\Greenshot-INSTALLER-1.2.10.6-RELEASE.exe /VERYSILENT /LOG="C:\SOFTWAREINSTALL.LOG" 
  Remove-PSSession $session
}

# ... then invoke it.
# Note that functions must be defined *before* they're called.
Invoke-InstallerRemotely -ComputerName DC1

[1]在功能中使用它意味着已输入目标计算机上的交互式会话,您必须以交互方式退出(通过键入和提交) exitExit-PSSession),然后再次在本地执行