1

我正在尝试使用以下脚本远程安装我们的构建(一个 msi),见下文。

问题是它不起作用,但奇怪的是,如果我从 PowerShell 控制台运行命令,它就会起作用。

我刚刚测试了在一台远程服务器上运行安装,它工作正常(我得到一个返回码 0,我还检查了远程服务器,它安装得很好)

所以我的问题是我在这里错过了什么?

为什么这些命令在从 PS 控制台运行时可以正常工作,但在使用脚本时却不行?

TIA

   param ($serverfile, $targetdir, $domainname, $username, $password,)

   if (-not($serverfile) -or -not($targetdir) -or -not($domainname) -or -not($username))
   {
   echo "error"
   exit
   }

     #default to c:\temp, this needs to be in the server
    $dest = "c$\temp\"

    #This is really good as it allows us to have some sort of type safety
    $srvs = Import-Csv $serverfile

    foreach ($item in $srvs) 
    { 
     if ($item.Type -eq "App" )
     {
        $name = $item.Hostname
        $path = "\\$name\" + $dest

        New-Item -ItemType directory -Path $path -Force

        Copy-Item -Path '.\Deployment.msi' -Destination $path -Force

        $wmi = "\\" +$name + "\ROOT\CIMV2:Win32_Product" 

        echo "Start Install Product"

        $product = ([WMIClass]$wmi)
        $var = $product.Install("c:\temp\Deployment.msi", "TARGETDIR=$targetdir DOMAINNAME=$domainname EMANRESU=$username PASSWORD=$password", $true)

        if ($var.ReturnValue -ne 0)
        { 
          echo "Error installing Deployment.msi on $name"
          echo "exit code: $var.ReturnValue"
        }   

        echo "Installed Product on $name"
     } 

编辑:

如果我硬编码服务器的名称,例如:

$path = '\\uk703\c$\temp\'
$wmi = '\\uk703\ROOT\CIMV2:Win32_Product'

然后一切正常

很明显,问题归结于我对变量如何扩展等缺乏了解......

任何指导将不胜感激

4

3 回答 3

0

可能是您的脚本未在需要它的环境中签名(即 PS 模式具有“受限”执行策略)。这是一个可以帮助您的帖子。

于 2012-10-11T08:29:43.810 回答
0

一个小的错误代码(显然不是脚本失败的原因),您正在以错误的方式扩展字符串中的变量属性:

"exit code: $var.ReturnValue"

正确的方法是:

"exit code: $($var.ReturnValue)"
于 2012-10-11T12:15:34.190 回答
0

我已经在我的博客中获得了完整的详细信息

本质上我已经使用 [string]::Format() 并且它似乎有效

于 2012-10-13T16:59:29.797 回答