下午好,
我正在尝试编写一个脚本来安装软件。脚本如下:
$ComputerName = Read-Host -Prompt "Please Enter The Computer Name"
$Software = Read-Host -Prompt "Please Enter The Software Name"
switch ($Software)
{
Java {$Software = "C:\Script\Java.msi"}
Atom {$Software = "C:\Script\AtomSetup.exe"}
Notepad {$Software = "C:\Script\notepad.exe"}
Default {Throw No Software Match found for $software}
}
$session = New-PSSession -ComputerName $ComputerName
Copy-Item -Path $Software -Destination C:\Script -Recurse -Verbose -ToSession $session
$session | Remove-PSSession
Invoke-Command -ComputerName $ComputerName -Credential (Get-Credential) -ScriptBlock {start-process -Filepath $software -ArgumentList '/silent' -wait
Remove-Item -Path $software -Force
}
我收到以下错误消息。
无法验证参数“FilePath”上的参数。该参数为 null 或为空。请提供一个非 null 或为空的参数,然后重试该命令。+ CategoryInfo : InvalidData: (:) [Start-Process],ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.StartProcessCommand + PSComputerName : testPC
无法将参数绑定到参数“Path”,因为它为空。+ CategoryInfo : InvalidData: (:) [Remove-Item], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.RemoveItemCommand + PSComputerName : testPC
任何帮助,将不胜感激
答案1
阅读并关注调用命令 文档:
-ArgumentList
提供命令中局部变量的值。在运行命令之前,命令中的变量将被这些值替换 在远程计算机上。以逗号分隔的列表形式输入值。值按列出的顺序与变量相关联。参数列表是参数。
中的值参数列表参数可以是实际值,例如 1024,也可以是局部变量的引用,例如
$max
。要在命令中使用局部变量,请使用以下命令格式:
{param($<name1>[, $<name2>]...) <command-with-local-variables>} -ArgumentList <value> -or- <local-variable>
关键字
param
列出了命令中使用的局部变量。参数列表按照列出的顺序提供变量的值。
使用
Invoke-Command -ComputerName $ComputerName -Credential (Get-Credential) `
-ScriptBlock {
param($Software)
Start-Process -Filepath $software -ArgumentList '/silent' -wait
Remove-Item -Path $software -Force
} -ArgumentList $Software