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

How to handle multi-type variables in Powershell?

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

$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(字符串)

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 = @(
    -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"
    }
)