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

时间:2015-05-20 20:12:50

标签: powershell vlookup

我有一个Powershell脚本,它通过一个可以是String或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(INT32)

90:4585 90:7878(STRING)

BA:4545 BA:2525(STRING)

0.6587(INT32)

查找的输出最好是:

650(0.451564 * 1440)= X

90:4585 = Y

BA:2525 = Z

等...每个代码。

今天......我得到了

650

90:4585 = Y

BA:2525 = Z

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

2 个答案:

答案 0 :(得分:1)

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

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

 else { 'Value is string' }

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

答案 1 :(得分:1)

您不应将值转换为[string],而不是[int],因此它们会保留原始类型。此外,您不应将中间结果导出并重新导入到文件中,因为您将它们转换为[string]

$Workbook.SaveAs("C:\StrippedHeader.csv")

$OutputLookUp2 = @(
    -split (Get-Content C:\StrippedHeader.csv -Raw) |
    ForEach-Object {
        switch -Wildcard ($_){
            *:* {$_}
            0.* {[int]([double]$_*1440)}
        }
    } |
    Sort-Object {$_ -is [string]},{$_} -Unique |
    ForEach-Object {
        "$_ $($Excel.WorksheetFunction.VLookup($_,$range4,3,$true))`r`n"
    }
)