将msi中的productcode插入powershell脚本 - 运行null值的问题

时间:2014-09-09 23:40:22

标签: powershell windows-installer powershell-v3.0 sccm

我正在为我们每月打包到SCCM 2012的产品编写一个自动化解决方案,并且在将* .msi文件的GUID解析为要在我的检测方法脚本中使用的变量时遇到一些困难。

无论我怎么做,我要么在变量前面有一个空格会破坏我的检测脚本,如果我尝试修改保存msi guid结果的变量,则会出现空值错误。

下面的代码段以及我得到的错误。

-

$FILE           =   "$APPLOCATION\$APPNAME.MSI"

#Function to pull the GUID from the Msi
#------------
function global:Get-MsiProductCode {
param(
[parameter(Mandatory=$true)]
[IO.FileInfo]$Path,
[parameter(Mandatory=$true)]
[ValidateSet("ProductCode","ProductVersion","ProductName")]
[string]$Property
)
try {
    $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer
    $MSIDatabase = $WindowsInstaller.GetType().InvokeMember("OpenDatabase","InvokeMethod",$Null,$WindowsInstaller,@($Path.FullName,0))
    $Query = "SELECT Value FROM Property WHERE Property = '$Property'"
    $View = $MSIDatabase.GetType().InvokeMember("OpenView","InvokeMethod",$null,$MSIDatabase,($Query))
    $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)
    $Record = $View.GetType().InvokeMember("Fetch","InvokeMethod",$null,$View,$null)
    $Value = $Record.GetType().InvokeMember("StringData","GetProperty",$null,$Record,1)
    return $Value
} 
catch {
    Write-Output $_.trim().replace(' ','')
}
}
#-------------
$MSICode =(Get-MsiProductCode -Path $File -Property ProductCode)
$testoutput = "Here is a test of the msicode.$msicode"
$SCRIPTDETECT   =   @"
if (gwmi -Query "select * from win32_Product where IdentifyingNumber='$MSICODE'") {
    if (gwmi -Query "select * from EthIL where $APPNAME`Version='$ENVIRO'") {write-host "Installed"}
    else{
        if (gwmi -Query "select * from EthIL where $APPNAME`64Version='$ENVIRO'") {write-host "Installed"}
        else {}
        }
}
else{}
"@

write-output $msicode
write-output $SCRIPTDETECT
write-host $testoutput 

-

上述代码的输出如下所示

{713335BD-14AB-460D-92C1-196DBE000D73}
if (gwmi -Query "select * from win32_Product where IdentifyingNumber=' {713335BD-14AB-460D-92C1-196DBE000D73}'") {
    if (gwmi -Query "select * from EthIL where EthILVersion='SDPRODCOPY'") {write-host "Installed"}
    else{
        if (gwmi -Query "select * from EthIL where EthIL64Version='SDPRODCOPY'") {write-host "Installed"}
        else {}
        }
}
else{}
here is a test of the msicode. {713335BD-14AB-460D-92C1-196DBE000D73}

-

因此您可以看到msicode的第一个回显带回GUID而没有空格。在调用$ MSICODE之前,使用$ MSICODE作为字符串的一部分会为字符串添加空格。

如果我尝试修改$ MSICODE以修剪空格或用下面的代码替换空格

$msicode = $msicode.replace(' ','')

我收到以下错误

You cannot call a method on a null-valued expression.
At line:45 char:1
+ $msicode = $msicode.replace(' ','')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

-

请帮忙!!我对零值感到很失落,但是当输出中没有一个空格时,我的大脑无法理解为什么在值之前放置空格!!!

更新 我找到了一种方法来获得使用psmsi之后的结果,使用下面的代码。

$msicode = get-msitable $File -table Property | where-object { $_.Property -eq "ProductCode" } | select-object -expand Value

这已经解决了我的问题,但是我仍然很好奇为什么我的功能会像它一样表现。

0 个答案:

没有答案