Преобразование Powershell V5 в Powershell V2 - PullRequest
0 голосов
/ 26 мая 2020

Согласно моему последнему вопросу Сравните два файла Мне наконец удалось заставить все работать внутри моего .bat. Еще раз спасибо за вашу поддержку.

Однако, как я узнал сегодня, мой руководитель использует Powershell в версии 2 вместо 5.1, чем я. Теперь проблема в том, что параметр -Raw этого кода:

$target = Get-Content "C:/pbr_tmp/PBreport/trc/TlsTrace.prn" -Raw 

Я изменил это на:

$target = [System.IO.File]::ReadAllText("C:/pbr_tmp/PBreport/trc/TlsTrace.prn")

К сожалению, результаты неверны, и я получаю следующую ошибку:

GetEnumerator : Fehler beim Aufrufen der Methode, da [System.Collections.DictionaryEntry] keine Methode mit dem Namen "GetEnumerator" enthält.

Кто-нибудь знает, есть ли в полном фрагменте кода что-то, что может вызвать это?

$data = Import-Csv "C:/trc/ModulID.txt" -Delimiter ";" -Header ID,Term 
$target = [System.IO.File]::ReadAllText("C:/pbr_tmp/PBreport/trc/TlsTrace.prn")
$counts = @{}
foreach ($term in $data.Term) {
  $term = $term + " "
  $index = -1
  $count = 0
  do {
    $index = $target.IndexOf($term, $index + 1)
    if ($index -gt -1) { $count++ } else { break; }
  } while ($true);
  if ($count -gt 0) {$counts[$term] = $count}
 }
 $counts = $counts.GetEnumerator() | sort name
 $counts.GetEnumerator() |ForEach-Object {$_.Key, $_.Value -join '' } |Set-Content C:/pbr_tmp/PBreport/trace_results.txt

Например,

$counts = $counts.GetEnumerator() | sort name

Не вызывает исключения.

1 Ответ

5 голосов
/ 26 мая 2020

Прежде чем перейти к ответу, позвольте мне предложить одно реальное решение :

Откажитесь от PowerShell 2.0 как можно скорее!

Он старый, медленный, не работает есть приятные функции, к которым вы привыкли, и он не поставляется с функциями ведения журнала, которые на самом деле делают PowerShell> 5 тем, что мы могли бы назвать защищаемой средой выполнения.

Если выбор работы окружающая среда не зависит от вас, читайте ниже


После окончания l oop $counts содержит объект типа [hashtable].

Но после выполнения этого оператора :

$counts = $counts.GetEnumerator() | sort name

$counts больше не [hashtable] - это массив отдельных записей ключ-значение, выплюнутый перечислителем.

Итак, чтобы решить эту проблему, удалите вызов GetEnumerator() на $counts в последнем операторе:

$counts = $counts.GetEnumerator() | sort name
$counts.GetEnumerator() |ForEach-Object {$_.Key, $_.Value -join '' } |Set-Content C:/pbr_tmp/PBreport/trace_results.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...