Добрый вечер. Здесь новичок в Stack Overflow и Powershell.
Приведенный ниже фрагмент кода в Powershell возвращает больше значений, чем мне хотелось. Например, он фиксирует в файле JSON переменные, соответствующие PPVCOUNT, а также переменные, имена которых содержат символы до и после строки PPVCount. Пример:
PPVCountAtInception
ОператорCountGreaterThanPPVCountIndicator
ЦЕЛЬ: Моя цель — сделать так, чтобы код возвращал только переменную PPVCount. Я также хочу сохранить столбцы: Pattern, LineNumber, Line. Простите за незнание и заранее спасибо
$file = 'C:\\Users\\B187515\\Downloads\\j.json'
$PPVCount = "PPVCount"
Get-Content $file | Select-String -Pattern $PPVCount -Context 1| Select-Object Pattern,LineNumber, Line -ExpandProperty Context -First 18 | Format-Table | Out-file -FilePath 'C:\\Users\\B187515\\Downloads\\test.csv' -Append
Ожидаемые результаты:
Моя цель состоит в том, чтобы код возвращал только переменную «PPVCount» в файле CSV. Я также хочу сохранить столбцы: Pattern, LineNumber, Line.
Фактические результаты Есть несколько возвращаемых переменных, которые содержат «PPVCount» где-то в имени переменной. См. скриншот CSV введите сюда описание изображения
Итак, выкройка, которую вы ищете, "PPVCount":
-Шаблон использует регулярное выражение. Чтобы получить только строку, начинающуюся с PPVCount, используйте «^PPVCount» или только содержащую, используйте «^PPVCount$».
В качестве отступления: несмотря на то, что пути к файлам безопасны, нет смысла использовать \\
вместо \
в PowerShell. \
не является escape-символом. в PowerShell есть `
.
Опираясь на полезные комментарии:
# Note: Just use '\' - no need for '\\'
$file = 'C:\Users\B187515\\Downloads\j.json'
# Enclose the property name to search for in embedded "..."
$searchRegex ='"PPVCount"'
# Pass $file (the file to search through) directly to Select-String,
# and use Export-Csv to export the results to a CSV file.
Select-String -LiteralPath $file -Pattern $searchRegex -Context 1 |
Select-Object Pattern, LineNumber, Line -ExpandProperty Context -First 18 |
Export-Csv -LiteralPath 'C:\Users\B187515\Downloads\test.csv'
Ваше намерение — искать строку PPVCount
как отдельное слово; поскольку вы, похоже, ищете эту строку как имя свойства JSON, вы можете предположить, что она заключена в встроенный "..."
и, следовательно, может сделать ее частью строки поиска.
Поскольку это эквивалентно буквальному поиску, вы можете добавить переключатель -SimpleMatch
, что, вероятно, повысит производительность.
Как правило, чтобы найти токен, состоящий только из букв, цифр или _
как отдельное слово, вы можете использовать утверждения границ слов, также известные как якорь (который является функцией регулярного выражения и поэтому требует от вас не использовать -SimpleMatch
), поэтому альтернативой в вашем случае будет использование $searchRegex ='\bPPVCount\b'
Поскольку вы намерены создать файл CSV, используйте Export-Csv для его создания.
Что касается того, что вы использовали: оба Format-Table
и Out-File
создают представления данных для человека-наблюдателя, поэтому никогда не следует использовать их для печати данных для программной обработки - см. этот ответ для получения дополнительной информации.
Предостережение относительно кодировки символов: в Windows PowerShell (версии до версии 5.1) Export-Csv
по необъяснимым причинам по умолчанию используется кодировка ASCII(!); тогда как в PowerShell (Core) 7 это похвально UTF-8 без спецификации. При необходимости используйте аргумент -Encoding
, но учтите, что -Encoding utf8
всегда создает файл UTF-8 со спецификацией в Windows PowerShell.
Пара отступлений:
Хотя это и безопасно для путей к файлам, нет смысла использовать \\
вместо \
в PowerShell. \
не является escape-символом. в PowerShell `
есть — см. раздел справки about_Special_Characters.
В приведенном выше примере путь к файлу для поиска передается непосредственно в Select-String через его параметр -LiteralPath
. Это гораздо эффективнее, чем передавать в него строки файла одну за другой через Get-Content, и требуется, если вы хотите видеть номера строк рядом с совпадающими строками в выводе дисплея по умолчанию.
Спасибо всем за ваши ответы. Я использовал $searchRegex ='"PPVCount"', удалил \\, но сохранил таблицу форматирования и выходной файл, поскольку визуально проверяю результаты.
Рад слышать, что это помогло, @BigSmooth. Если вы придерживаетесь Out-File
, я предлагаю не использовать расширение имени файла .csv
. Также обратите внимание, что вы можете помочь будущим читателям, четко обозначив, какой ответ, если таковой имеется, решил вашу проблему, а именно приняв его.
удалите
Format-Table
и заменитеOut-File
наExport-Csv