如何在 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"
}
)
我有一个 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"
}
)