我正在编写一个 Powershell 脚本,以便在多台机器上自动静默安装 Avamar Client。
这是我目前编写的脚本,但它不断出现错误:
#Variables
$computername=Get-Content C:PSdeploy\list.txt
$sourcefile= "\\mydomain.org\public\AvamarClient-windows-x86_64-7.1.100-370.msi"
$credentials = Get-Credential
#This section will install the software
foreach ($computer in $computername)
{
$destinationFolder = "\\$computer\C$\Temp"
#This section will copy the $sourcefile to the $destinationFolder. If the Folder does not exist it will create it.
if (!(Test-Path -path $destinationFolder))
{
New-Item $destinationfolder -Type Directory
}
Copy-Item -Path $sourcefile -Destination $destinationFolder
Invoke-Command -ComputerName $computer -ScriptBlock {Start-Process 'c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi' -ArgumentList msiexec /I} -credential $creds
}
这是我收到的错误:
PS C:\Users\n1254937> C:\Users\myuserid\Desktop\AvamarClient remote install.ps1
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
A positional parameter cannot be found that accepts argument '/I'.
+ CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
+ PSComputerName : test.mydomain.org
我究竟做错了什么?
答案1
这定义-ArgumentList
是<String[]>
,这是一个字符串数组。
按原样,它将其视为-ArgumentList msiexec
,后跟的/I
不是有效的参数Start-Process
。
要指定多个参数,您需要将它们作为字符串数组提供,在 PowerShell 中可以将其写为逗号分隔的列表。因此,要指定两个参数,您可以使用-ArgumentList 'msiexec','/I'
。
话虽如此,我认为即使你做了这样的修正,它也不会起作用。照原样,你告诉它运行 .MSI 文件,并向 .MSI 文件提供两个参数:msiexec
和/I
。
您应该要做的是开始msiexec
,指定 .MSI 文件和/I
的参数msiexec
。
因此,尝试如下方法:
{Start-Process 'msiexec' -ArgumentList 'c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi','/I'}
要不就:
{Start-Process 'msiexec' 'c:\temp\AvamarClient-windows-x86_64-7.1.100-370.msi','/I'}
...因为-ArgumentList
实际上是可选的(就像-FilePath
是)。