'Session' Parameter is null or empty in PowerShell script

爷,独闯天下 提交于 2021-02-11 05:28:38

问题


I'm very new to PowerShell (forgive my ignorance) and am trying to install a program remotely on multiple computers on my domain. Currently, I'm just trying to get it to work on one computer. The script below was found online and adapted for my needs. Yesterday it worked, but today it's complaining about the session parameter.

I don't fully understand "sessions", but I have ensured on the client machine that the winrm service is running and I have invoked Enable-PSRemoting -force.

Here's the script:

$computers = Get-Content "c:\tmpPS\computers.txt"
$rs = Get-PSSession
Get-PSSession | Get-Member
######
## Functions
################

foreach ($comp in $computers)
{
    Write-Host "should work with $comp"
}

PushMSI
RemoteConnect
InstallMSI

Function PushMSI {
 Write-Host "------------------------------------------------"
 Write-Host "This will copy the MSI file from localhost c:\tmpPS\"
 write-Host "------------------------------------------------"
 Write-Host ""
 Write-Host ""
 foreach ($comp in $computers)
{
   Copy-Item -path "c:\tmpPS\clientInstall.msi" -Destination \\$comp\c$\tmpPS

}
}

Function RemoteConnect
{
 Write-Host "------------------------------------------------"
 Write-Host "This will establish a PSSession with all computers in c:\temp\computers.txt"
 write-Host "------------------------------------------------"
 Write-Host ""
 Write-Host ""
Get-Content C:\tmpPS\computers.txt | New-PSSession -ThrottleLimit 50
}

Function InstallMSI
{
 Write-Host "------------------------------------------------"
 Write-Host "This will Install UPS Update on all computers with an Established PSSession"
 write-Host "------------------------------------------------"
 Write-Host "After the Install PSSessions will be removed"
 Write-Host ""

Invoke-Command -Session $rs -ScriptBlock {invoke-item "c:\tmpPS\ClientInstall.msi"}
}

Get-PSSession | Remove-PSSession

And here's the output:

PS C:\Users\Me> C:\tmpPS\remoteInstall.ps1
Get-Member : No object has been specified to the get-member cmdlet.
At C:\tmpPS\remoteInstall.ps1:3 char:17
+ Get-PSSession | Get-Member
+                 ~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand

should work with eSignWin81.informa.local
------------------------------------------------
This will copy the MSI file from localhost c:\tmpPS\
------------------------------------------------


------------------------------------------------
This will establish a PSSession with all computers in c:\temp\computers.txt
------------------------------------------------



 Id Name            ComputerName    State         ConfigurationName     Availability
 -- ----            ------------    -----         -----------------     ------------
  6 Session6        eSignWin81.i... Opened        Microsoft.PowerShell     Available
------------------------------------------------
This will Install UPS Update on all computers with an Established PSSession
------------------------------------------------
After the Install PSSessions will be removed

Invoke-Command : Cannot validate argument on parameter 'Session'. The argument is null or empty. Supply an argument that is not null or empty and then try 
the command again.
At C:\tmpPS\remoteInstall.ps1:49 char:25
+ Invoke-Command -Session $rs -ScriptBlock {invoke-item "c:\tmpPS\ClientInstall.ms ...
+                         ~~~
    + CategoryInfo          : InvalidData: (:) [Invoke-Command], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand

回答1:


Try not to use Write-Host as it brakes the pipeline and kills puppy's.

I've tried to improve your script a little bit, so you understand the logic behind the structure better. It hasn't been tested, but it should do the trick.

# First parameters
[CmdletBinding()]
Param(
    [ValidateScript({Test-Path $_ -PathType leaf})]
    $ComputerList = "c:\tmpPS\computers.txt",
    [ValidateScript({Test-Path $_ -PathType leaf})]
    $MSI = "c:\tmpPS\clientInstall.msi"
)

# Then functions
Begin {
    Function Copy-MSI {
         foreach ($Com in $Computers) {
           Copy-Item -path $MSI -Destination "\\$Com\c$\tmpPS"
        }
    }

    Function Install-MSI {
         foreach ($Com in $Computers) {
            Enter-PSSession -ComputerName $Com
            invoke-item "c:\tmpPS\ClientInstall.msi"
            Exit-PSSession
        }
    }
}

# Then the actions
Process {
    $Computers = Get-Content $ComputerList
    Copy-MSI
    Install-MSI
}

If you run this, you'll find the information you're looking for:

Get-Help Enter-PSSession


来源:https://stackoverflow.com/questions/27844862/session-parameter-is-null-or-empty-in-powershell-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!