我正在为我们每月打包到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
这已经解决了我的问题,但是我仍然很好奇为什么我的功能会像它一样表现。