如何在Powershell中处理多类型变量?

如何在Powershell中处理多类型变量?,powershell,vlookup,Powershell,Vlookup,我有一个Powershell脚本,它通过一个可以是字符串或Int32类型的变量运行Excel VLookUp函数。当我将$Value变量声明为String或Int32时,脚本运行得非常好,但是如何处理$Value变量可以是Int32或String形式(例如:$Value=155(uint32)或$Value=90:9123 80:8989(String))的事实呢。有什么想法吗 $files2MX1005 = Get-ChildItem C:\source -Recurse $Excel =

我有一个Powershell脚本,它通过一个可以是字符串或Int32类型的变量运行Excel VLookUp函数。当我将$Value变量声明为String或Int32时,脚本运行得非常好,但是如何处理$Value变量可以是Int32或String形式(例如:$Value=155(uint32)或$Value=90:9123 80:8989(String))的事实呢。有什么想法吗

$files2MX1005 = Get-ChildItem C:\source -Recurse

$Excel = New-Object -ComObject excel.application
[reflection.assembly]::LoadWithPartialName( "Microsoft.Office.Interop.Excel" )
$Excel.visible = $false
$Excel.DisplayAlerts=$False

foreach($fileMX1005 in $files2MX1005) {

    $Workbook = $Excel.Workbooks.open($fileMX1005.FullName) 
    $workbook2 = $Excel.Workbooks.open("C:\Lookup_Table.xlsx")
    $range4 = $workbook2.ActiveSheet.Range("A2:E10")
    $range = $Workbook.ActiveSheet.Range("A1:FZ1").EntireColumn 
    $range2 = $Workbook.ActiveSheet.Range("A1:A39").EntireRow 
    $range.Delete()
    $range2.Delete()
    $Workbook.SaveAs("C:\StrippedHeader.csv")

    $Values = @(Get-Content C:\StrippedHeader.csv -Raw) -split '\s+' | Where-Object {$_ -like '*:*' -or '0.*'} 

    for ($i = 0; $i -lt $Values.length; $i++) {
    if ($Values[$i] -lt 1) { [float]$Values[$i] *= 1440 }
    }                

    "UniqueActiveFaults" |Out-File C:\IdealOutput.csv
    $Values | Sort-Object -Unique | Out-File CIdealOutput.csv  

    $Values2 = @(Get-Content C:\IdealOutput.csv) 


    $OutputLookUp2 = @()
    foreach ($Value in $Values2){
        $OutputLookUp2 += "$Value $($Excel.WorksheetFunction.VLookup([int32]$Value,$range4,3,$true))`r`n"          
}
Idealoutput.csv的外观示例:

0.451564(INT32)

0.84645(整数32)

90:4585 90:7878(字符串)

BA:4545 BA:2525(字符串)

0.6587(INT32)

理想情况下,查找的输出为:

650(0.451564*1440)=X

90:4585=Y

BA:2525=Z

等等。。。对于每个代码

今天…我得到

650

90:4585=Y

BA:2525=Z


650的查找输出未成功,因为查找未将其作为字符串读取

您可以测试它是否将转换为[int32]

if ($Value -as [int32] -is [int32])
  {'Value is integer'}

 else { 'Value is string' }

然后为该类型运行相应的代码。

您不应该将值转换为非
[string]
,而不是转换为
[int]
,以便它们保留其原始类型。此外,您不应该将中间结果导出和重新导入到文件中,因为这样可以将它们转换为
[string]

$Workbook.SaveAs(“C:\StrippedHeader.csv”)
$OutputLookUp2=@(
-拆分(获取内容C:\StrippedHeader.csv-Raw)|
ForEach对象{
开关-通配符($\ux){
*:* {$_}
0.*{[int]([double]$*1440)}
}
} |
排序对象{$\为[string]},{$\唯一|
ForEach对象{
“$\$($Excel.WorksheetFunction.VLookup($\$range4,3,$true))`r`n”
}
)

我明白您的观点,这是一个选项,但我不希望这样做,因为字符串或整数的代码都是相同的。有没有更有效的方法?或者按照您的建议进行测试不会影响脚本的性能吗?我刚刚进行了测试,运行该测试需要0.2毫秒。我不认为这会影响你的表现。谢谢-现在我知道这是一个选择,为了保持我的脚本简短有序,我仍然想知道是否有更简单的方法来处理这个问题,所以我将等待进一步的评论。但是谢谢你!只要始终将其强制转换,不要进行检查:
“BlahBlah$([int32]$Value)blah”
,或者更恰当地说,
“blah$([String]$Value)blah”
@briantist,很抱歉我没有得到它。我对Powershell是新手。你能再详细解释一下吗?实际问题是什么?您说,无论
$Value
[string]
还是
[int32]
类型,都会运行相同的代码,因此您是否有实际理由需要区分类型?或者这仅仅是学术性的?或者您是在试图避免使用非字符串或int32的东西运行VLookup?或者,如果可能的话,您希望将字符串转换为整数吗?问题是$Value同时包含字符串和int32。凭条无法同时处理这两种情况。它处理字符串或整数,其余部分给我一个错误,因为$Value被设置为只处理一种类型的数据。@CarlosSousa,您需要显示这个问题。PowerShell可以在另一个字符串中展开包含字符串和数字的数组。现在还不清楚问题出在哪里。创建一个代码示例,手动定义一个通常从VLookup返回的数组,这样我们就可以自己测试代码了。@briantist,请参阅上面我的原始帖子的更新。非常感谢您的帮助。此条件
$类似于“*:*”或“0.*”
始终
$true
。如果excel文件包含
0.451564
,您希望如何查找
650
的内容?