Powershell - проблема с типом массива - PullRequest
1 голос
/ 23 апреля 2011

и заранее благодарю за внимание.У меня возникла проблема в сценарии, который я написал в Powershell.Сценарий, приведенный ниже, немного неаккуратный, поэтому, пожалуйста, прости меня.

По сути, этот скрипт принимает данные из каталога текстовых файлов.Каждый файл имеет следующую строку:

    # Split full path and peak usage
    $CalculationBuffer = $DailyBuffer[$k].Split(",")

Что приводит к следующей ошибке:

Method invocation failed because [System.Char] doesn't contain a method named 'Split'.
At D:\script.ps1:387 char:52
+         $CalculationBuffer = $DailyBuffer[$k].Split <<<< (",")
+ CategoryInfo          : InvalidOperation: (Split:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Итак, мой вопрос: неправильно ли приведен массив?Так как он сообщает [System.Char] вместо [System.String]?

Если файл, который я ввожу, имеет две строки, это не приводит к этой ошибке.Если файл имеет только одну строку, он будет преобразован как [System.Char].

: Полный сценарий:

# Monthly Output File
[string]$monthoutfile = $ProgPath + "Billing\" + $monthdate + "\_Master_" + $monthdate + ".log"
[string]$currentmonth = $ProgPath + "Billing\" + $monthdate + "\"

# Define what type of files to look for
$files = gci $currentmonth | Where {$_.extension -eq ".log"}

# Create a datastore\dictionary for this month
$MonthDataDictionary = New-Object 'System.Collections.Generic.Dictionary[string,long]'
$MonthAvgDictionary = New-Object 'System.Collections.Generic.Dictionary[string,long]'
# Arrays
$DailyBuffer = @()
$CalculationBuffer = @()
$TempArray = @()
# Counters\Integers
[int]$Linesinday = 1
[int]$DayCounter = 1
[int]$LineCounter = 0
# Strings
[string]$DailyPath = ""
[string]$Outline = ""
# Longs
[long]$DailyPeak = 0
[long]$Value = 0

##########################################################################
# Begin Loop

# Write once...
#$CalcBuffer += "\"

foreach ($file in $files) 
{

    # First get content from text file and store in buffer
    $DailyBuffer = Get-Content $file.pspath

    # Determine how many lines are in the file, call function
    $Linesinday = linecount $file.pspath

    for ($k = 0; $k -lt $Linesinday; $k++ ) 
    { 

        # Split full path and peak usage
        $CalculationBuffer = $DailyBuffer[$k].Split(",")

        # Store site path
        $DailyPath = $CalculationBuffer[0] + $CalculationBuffer[1] + $CalculationBuffer[2]

        # Store peak usage
        $DailyPeak = $CalculationBuffer[3]

        # Write to dictionary under conditions

        # Check if current path is stored or "Site".
        # If NOT .ContainsKey($DailyPath)
        if (!($MonthDataDictionary.ContainsKey($DailyPath))) {

            # Add Key
            $MonthDataDictionary.Add($DailyPath, $DailyPeak)

        # If it does contain a value
        } elseif ($MonthDataDictionary.ContainsKey($DailyPath)) {

            # Add the value to the current value for averaging
            $MonthDataDictionary.Item($DailyPath) += $DailyPeak

        }
    }

    # Accumulator
    $DayCounter ++

}        

# Now that each file is tallied up, run an average calculation
$MonthDataDictionary.getenumerator() | Foreach-Object -process {
    $Value = $_.Value / $DayCounter
    $MonthAvgDictionary.Add($_.Key, $Value)

}

# Debug:
# Write-Host the values
$MonthAvgDictionary

# Output the "Average Peak" values to a file
$MonthAvgDictionary.getenumerator() | Foreach-Object -process {

        # Construct output line
        $OutLine = $_.Key + "," + $_.Value
        $OutLine >> $MonthOutFile
}

Ответы [ 3 ]

5 голосов
/ 23 апреля 2011

Это известная ловушка в Powershell. Просто оберните Get-Content в массив "выражение" @():

$DailyBuffer = @(Get-Content $file.pspath)
0 голосов
/ 16 января 2017

У меня была такая же проблема, и только линия, как показано ниже, решила эту проблему. Для вашей проблемы это будет:

[string[]] $DailyBuffer = Get-Content $file.pspath
0 голосов
/ 23 апреля 2011

Я думаю, что ваша проблема в том, что get-content возвращает не массив строк (строк), а одну строку. Таким образом, когда вы смотрите на $ dailybuffer [k], вы смотрите на k-й символ строки, а не на k-ю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...