Поиск в файле в powershell: Поиск файлов через Powershell | FixMyPC
Поиск файлов через Powershell | FixMyPC
Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.
Get-ChildItem -Path "C:\" -Recurse
Где:
- Path — где искать. Если его не указать, то powershell будет искать там файлы, откуда он и запущен. Через запятую можно указать несколько директорий.
- Recurse — рекурсивный поиск. Когда этот ключ не установлен, показываются файлы только текущей папки. Когда этот установлен, показываются, в том числе, папки и файлы внутри других папок.
Если у нас ожидаются папки, к которым у нас нет доступа, то мы можем добавить ключ -ErrorAction, что бы процесс поиска не останавливался с ошибкой:
Get-ChildItem -Path "C:\Windows\" -Recurse -ErrorAction SilentlyContinue
Для поиска нужных элементов у нас есть два ключа: для включения параметра и исключения. Например я знаю точно, что у программы «Калькулятор» файл имеет в названии calc, а расширение exe. При этом не уверен находится ли он в папке Windows или Program Files и включу оба пути. Так же я хочу исключить файлы с расширением msi и словом win:
Get-ChildItem -Path C:\Windows\,C:\Program Files\ -Include "*calc*.exe" -Exclude "*.msi","win*" -Recurse -Force -ErrorAction SilentlyContinue
Где:
- Include нужен для поиска вхождения. Знак * говорит, что я не знаю с чего начинается имя файла, но в нем есть calc, я не знаю что идет после, но заканчивается на .exe . Например под эти результаты подходят 1111calc1111.exe или AbcAlc2.exe.
- Exclude говорит, что мне не нужно, т.е. исключит из выдачи. Это файлы заканчивающиеся на .msi и начинающиеся на win.
- Force этот ключ позволяет искать в скрытых файлах и папках
Если мы используем Include и не используем Recurse, то знак * обязателен в Path иначе результат будет пустой.
Теперь попробуем найти файлы, которые были созданы за последнюю неделю. Для этого, сначала, объявим переменную с датой:
$date = Get-Date -Year 2019 -Month 6 -Day 22 -Hour 1 -Minute 00
Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).
Затем передадим эти значения в наш поиск:
Get-ChildItem -Path "C:\" -Include "*.txt" -Exclude "*.rar" -Recurse | Where-Object {$_.LastWriteTime -ge $date}
Где:
- | это конвейер или Pipline, он говорит о том, что к каждому объекту слева нужно применить действия справа
- Where-Object {$_.LastWriteTime — говорит о том, что нужно применять только к тем объектам, где есть значение LastWriteTime (последнее время изменения).
- -ge $date — значит, что объект должен быть больше или равен (Greater than or equal) нашей переменной с датой. Если бы мы хотели узнать до определенной даты, мы должны были бы указать -le $date, -eq если бы дата была бы ровна. Называется «Операторы сравнения»
Мы можем искать внутри файлов, т.е. вхождение строк:
Get-ChildItem -Path C:\Folder1\ -Include "*.txt" -Recurse | Select-String -SimpleMatch "fixmypc"
Где:
- SimpleMatch — строка, которую мы хотим найти внутри файла
В случае выше, для всего что слева от pipeline | , будет идти поиск внутри файлов на упоминание строки fixmypc.
Командлет Select-String может использоваться для поиска файлов:
Select-String -Path C:\Folder1\* -SimpleMatch "fixmypc" -Include "*.txt" -Exclude "*.rar"
Разница в том, что он будет искать только в текущей папке, а не во вложенных. Он так же будет искать вхождение в каждом файле, что при большом объеме существенно увеличит время работы. Т.е. эта команда предназначена уже для отфильтрованных значений, например после Get-ChildItem.
Но в Select-String есть дополнительные ключи, которые могут быть полезны. Вот часть из них:
- CaseSensitive — в обычных командлетах и сравнениях Powershell «а» и «А» одинаковые буквы. Если поставить этот ключ, то они станут разными
- Pattern — если с ключом SimpleMatch мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.
…
Теги:
#powershell
Powershell. Поиск в тексте | administra.top
Иногда есть необходимость найти файл, по содержащимся в нем словам, или же найти все строки содержащие нужный паттерн.
Рассмотрим несколько вариантов поиска по тексту в Powershell
Для примера я буду искать в логах Exchange 2013 нужного мне отправителя
$Files = (dir «C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\FrontEnd» -Recurse -Filter «*.log» ).FullName
| $Files = (dir «C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\FrontEnd» -Recurse -Filter «*.log» ).FullName |
Использовать командлет Select-String можно разными способами. Например подавать содержимое файлов через конвейер:
Get-Content $Files | Select-String «sendreports» | ? { $_ -match «2018-11-16» }
| Get-Content $Files | Select-String «sendreports» | ? { $_ -match «2018-11-16» } |
Но лучше указывать объект с данными в виде аргумента InputObject, так как это выполняется гораздо быстрее:
Select-String -InputObject $(Get-Content $Files) -Pattern «sendreports» | ? { $_ -match «2018-11-16» }
| Select-String -InputObject $(Get-Content $Files) -Pattern «sendreports» | ? { $_ -match «2018-11-16» } |
В поисках производительности
Если замерить скорость выполнения этой команды, то она будет крайне не высокой:
Measure-Command {
Get-Content $Files | Select-String «sendreports» | ? { $_ -match «2018-11-16» }
} # 260 Seconds
| Measure-Command { Get-Content $Files | Select-String «sendreports» | ? { $_ -match «2018-11-16» } } # 260 Seconds |
Указывая список файлов в виде аргумента для Select-String мы получим значительный прирост скорости поиска:
# Measure-Command показывает что такая команда выполняется в 20 раз быстрее предыдущей
Measure-Command {
Select-String -Path $Files -Pattern «sendreports» | ? { $_ -match «2018-11-16» }
} # 12 Seconds
| # Measure-Command показывает что такая команда выполняется в 20 раз быстрее предыдущей Measure-Command { Select-String -Path $Files -Pattern «sendreports» | ? { $_ -match «2018-11-16» } } # 12 Seconds |
Workflow
Так же попробовал несколько вариантов использования Select-String в Workflow.
Сначала вариант с циклом:
Так как командлет Where-Object не поддерживается в Workflow,
то фильтры можно вынести либо за его пределы,
или же поместить в InlineScript
$Files = ( dir «C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\FrontEnd» -Recurse -Filter «*.log» ).FullName
workflow FindString($Files){
foreach -parallel ($file in $workflow:files){
(Select-String -Path $file -Pattern «sendreports» ).line | Write-Output } }
Measure-Command { FindString $Files | ? { $_ -match «2018-11-16» } } # 18 Seconds
| $Files = ( dir «C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\FrontEnd» -Recurse -Filter «*.log» ).FullName workflow FindString($Files){ foreach -parallel ($file in $workflow:files){ (Select-String -Path $file -Pattern «sendreports» ).line | Write-Output } } Measure-Command { FindString $Files | ? { $_ -match «2018-11-16» } } # 18 Seconds |
На удивление, никакого прироста скорости поиска я не получил, даже увеличивая значение «-throttlelimit»
Самым быстрый вариант
Здесь в блоке parallel мы, используя InlineScript, заносим результат Select-String в массив
workflow FindString{
$Files = ( dir «C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\FrontEnd» -Recurse -Filter «*.log» ).FullName
$yourData = @()
parallel { $workflow:yourData += inlinescript{
Select-String -Path $using:Files -Pattern «sendreports» | ? { $_ -match «2018-11-16» }}}
$yourData.line
}; Measure-Command { FindString } # 7 Seconds
| workflow FindString{ $Files = ( dir «C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\FrontEnd» -Recurse -Filter «*.log» ).FullName $yourData = @() parallel { $workflow:yourData += inlinescript{ Select-String -Path $using:Files -Pattern «sendreports» | ? { $_ -match «2018-11-16» }}} $yourData.line }; Measure-Command { FindString } # 7 Seconds |
Не могу объяснить за счет чего именно достигается увеличение скорости поиска, тем не менее, при необходимости найти документ или строки в большом объеме данных, можно использовать эту конструкцию.
Можно искать по всем дискам компьютера, или же и вовсе по списку компьютеров.
Думаю в этом случае мы получим прирост по времени, значительно больший чем 3 секунды
GREP в Powershell — поиск через Select-String
В Powershell есть командлет, похожий на grep в Linux, Select-String. С помощью него мы можем искать как файлы, так и вхождения строк и, по желанию, используя регулярные выражения.
Для поиска внутри файла можно выполнить следующий командлет:
Select-String -Path *.txt -Pattern "fix"
Где:
- Path — путь до директории или документа. В моем случае будут искаться все файлы с расширением .txt, т.к. знак * говорит что мы не знаем что находится слева. Если путь не указан, то он используется по умолчанию, откуда запущен powershell.
- Pattern — строка, которую мы ищем внутри файла. Этот ключ используется для регулярных выражений. Для использования простого поиска, без регулярки, нужно ставить -SimpleMatch
Мы можем искать не только в файлах, но и в самих строках:
$str = "Hello World"
Select-String -InputObject $str -SimpleMatch "hello","idk"
Где:
- InputObject — объект, в котором мы будем искать переменную
- SimpleMatch — простое совпадение. В моем случае их два. Если «hello» или «idk» будет в строке, то команда вернет строку.
Если мы используем путь в какую-то папку, то мы можем включать и исключать какие-то свойства:
$path = "C:\Folder1\New folder\*"
Select-String -Path $path -SimpleMatch "fix" -Include "*.txt" -Exclude "text*" -CaseSensitive
Где:
- $path — переменная с путем, которая включает все файлы в папке «New Folder».
- Include — включает все файлы. В моем случае с расширением .txt
- Exclude — исключает все файлы, которые начинаются на text.
- CaseSensitive — учет регистра. В powershell, по умолчанию, буква «а» и «А» одинаковые, а с этим ключом они будут разными.
Т.к. командлет ищет только в текущей папке, но мы можем использовать другой, который рассматривался тут, для более глубокого поиска файлов через Powershell:
Get-ChildItem -Path 'C:\Folder1\' -Recurse -Exclude "*.mp3" | Select-String -SimpleMatch "fix"
Где:
- Recurse — рекурсивный поиск т.е. поиск по всем папкам включительно.
- Exclude — исключаем файлы с расширением mp3
Если в папке много файлов, то конечно быстрее будет сначала отфильтровать файлы через powershell Get-ChildItem, а затем искать в них нужные строки через Select-String.
С помощью такой команды мы можем исключить файлы, к которым у нас нет доступа иначе может быть ошибка:
Get-ChildItem -Path 'C:\Folder1\' -Recurse -Exclude "*.mp3" -ErrorAction SilentlyContinue |
Select-String -SimpleMatch "fix" -NotMatch
Где:
- NoMatch — говорит, что нам нужны только те строки, где нет «fix» или дословно «Не совпадает»
- ErrorAction — со значением SilentlyContinue — говорит «не уведомлять об ошибках».
Разницу с Nomatch можно увидеть на картинке:
Если файл или строка в другой кодировке, то мы можем указать дополнительный ключ в виде -Encoding. Он может принимать следующие значения:
- ASCII
- BigEndianUnicode
- OEM
- Unicode
- UTF7
- UTF8
- UTF8BOM
- UTF8NoBOM
- UTF32
…
Теги:
#powershell
Powershell поиск текста в файле
Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.
- Path — где искать. Если его не указать, то powershell будет искать там файлы, откуда он и запущен. Через запятую можно указать несколько директорий.
- Recurse — рекурсивный поиск. Когда этот ключ не установлен, показываются файлы только текущей папки. Когда этот установлен, показываются, в том числе, папки и файлы внутри других папок.
Если у нас ожидаются папки, к которым у нас нет доступа, то мы можем добавить ключ -ErrorAction, что бы процесс поиска не останавливался с ошибкой:
Для поиска нужных элементов у нас есть два ключа: для включения параметра и исключения. Например я знаю точно, что у программы «Калькулятор» файл имеет в названии calc, а расширение exe. При этом не уверен находится ли он в папке Windows или Program Files и включу оба пути. Так же я хочу исключить файлы с расширением msi и словом win:
- Include нужен для поиска вхождения. Знак * говорит, что я не знаю с чего начинается имя файла, но в нем есть calc, я не знаю что идет после, но заканчивается на .exe . Например под эти результаты подходят 1111calc1111.exe или AbcAlc2.exe.
- Exclude говорит, что мне не нужно, т.е. исключит из выдачи. Это файлы заканчивающиеся на .msi и начинающиеся на win.
- Force этот ключ позволяет искать в скрытых файлах и папках
Если мы используем Include и не используем Recurse, то знак * обязателен в Path иначе результат будет пустой.
Поиск файлов через Powershell по дате
Теперь попробуем найти файлы, которые были созданы за последнюю неделю. Для этого, сначала, объявим переменную с датой:
Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).
Затем передадим эти значения в наш поиск:
- | это конвейер или Pipline, он говорит о том, что к каждому объекту слева нужно применить действия справа
- Where-Object <$_.LastWriteTime — говорит о том, что нужно применять только к тем объектам, где есть значение LastWriteTime (последнее время изменения).
- -ge $date — значит, что объект должен быть больше или равен (Greater than or equal) нашей переменной с датой. Если бы мы хотели узнать до определенной даты, мы должны были бы указать -le $date, -eq если бы дата была бы ровна. Называется «Операторы сравнения»
Поиск по содержимому файлов через Powershell
Мы можем искать внутри файлов, т.е. вхождение строк:
- SimpleMatch — строка, которую мы хотим найти внутри файла
В случае выше, для всего что слева от pipeline | , будет идти поиск внутри файлов на упоминание строки fixmypc.
Командлет Select-String может использоваться для поиска файлов:
Разница в том, что он будет искать только в текущей папке, а не во вложенных. Он так же будет искать вхождение в каждом файле, что при большом объеме существенно увеличит время работы. Т.е. эта команда предназначена уже для отфильтрованных значений, например после Get-ChildItem.
Но в Select-String есть дополнительные ключи, которые могут быть полезны. Вот часть из них:
- CaseSensitive — в обычных командлетах и сравнениях Powershell «а» и «А» одинаковые буквы. Если поставить этот ключ, то они станут разными
- Pattern — если с ключом SimpleMatch мы можем найти конкретную строку (нельзя использовать * звездочку), то с этим ключом мы можем использовать регулярные выражения.
.
Иногда есть необходимость найти файл, по содержащимся в нем словам, или же найти все строки содержащие нужный паттерн.
Рассмотрим несколько вариантов поиска по тексту в Powershell
Для примера я буду искать в логах Exchange 2013 нужного мне отправителя
Использовать командлет Select-String можно разными способами. Например подавать содержимое файлов через конвейер:
Как видно это весьма медленный вариант.
Указывая список файлов аргументом Select-String мы получим значительный прирост скорости поиска.
Workflow
Я попробовал несколько вариантов использования Select-String в Workflow.
Сначала вариант с циклом:
На удивление, никакого прироста скорости поиска я не получил, даже увеличивая значение «-throttlelimit»
Самым быстрый вариант
Здесь в блоке parallel мы, используя InlineScript, заносим результат Select-String в массив
Не могу объяснить за счет чего именно достигается увеличение скорости поиска, тем не менее, при необходимости найти документ или строки в большом объеме данных, можно использовать эту конструкцию.
Можно искать по всем дискам компьютера, или же и вовсе по списку компьютеров.
Думаю в этом случае мы получим прирост по времени, значительно больший чем 3 секунды
Я знаю, что этот вопрос может быть «вопросом нового парня», но я, вероятно, допустил логическую ошибку.
У меня есть текстовый файл, и я хочу искать, содержит ли он строку или нет. Я попробовал это, как показано ниже, но это не работает:
я думаю, это то, что вы пытаетесь сделать:
В вашем примере вы определяете строку с именем $SEL , а затем проверяете, равна ли она $null (что, конечно, всегда будет иметь значение false , поскольку определяемая вами строка не является $null ! )
Кроме того, если файл содержит шаблон, он вернет что-то вроде:
Поэтому не забудьте переключить свои -eq на -ne или поменять местами свои команды if/else , потому что в настоящее время вы повторяете Contains String , когда $SEL равен $null , то есть назад.
Проверьте SS64 для объяснений и полезных примеров для всего в PowerShell и cmd
Другой способ проверить, существует ли строка в файле:
но это не дает вам указание на то, где в файле существует текст. Этот метод также работает по-другому, так как вы сначала получаете содержимое файла с помощью Get-Content , поэтому это может быть полезно, если вам нужно выполнить другие операции с этим содержимым после проверки существования строки.
Как выполнить поиск строки в нескольких файлах и вернуть имена файлов в Powershell?
Я начал изучать powershell пару дней назад, и я не мог найти ничего в google, что делает то, что мне нужно, поэтому, пожалуйста, ответьте на мой вопрос.
меня попросили заменить некоторые текстовые строки в несколько файлов. Я не обязательно знаю расширение возможных целевых файлов,и я также не знаю их местоположение. До сих пор мне удалось рекурсивно просматривать каталог (get-ChildItem -recurse
) и найти строку, которую я искал с get-content и select-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
проблема в том, что я вижу вхождения текста, который я ищу, но я не знаю, как сказать PS, чтобы вернуть путь и имя для всех соответствующих файлов.
Как я могу получить имя и расположение файлов, содержащих выражение, которое я ищу?
9 ответов
Это должно дать местоположение файлов, содержащих ваш шаблон:
Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
здесь есть множество точных ответов, но вот самый краткий код для нескольких различных вариантов. Для каждого варианта верхняя строка показывает полный синтаксис, а нижняя-краткий синтаксис.
пункт (2) является более краткой формой ответов от Jon Z и manojlds, в то время как пункт (1) эквивалентен ответам от vikas368 и buygrush.
список FileInfo предметы для всех файлов, содержащих выкройка:
Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet } ls -r filespec | ? { sls pattern $_ -q }
список имена файлов для всех файлов, содержащих шаблон:
Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path ls -r filespec | sls pattern | select -u Path
список FileInfo предметы для всех файлов не содержащий шаблон:
Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) } ls -r filespec | ? { !(sls pattern $_ -q) }
список имена файлов для всех файлов не содержащий шаблон:
(Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
52
автор: Michael Sorens
труба содержимое
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
to fl *
вы увидите, что путь уже возвращается как свойство объектов.
если вы хотите только путь, используйте select path
или select -unique path
удалить дубликаты:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}
Это даст вам полную информацию о всех файлах
это отобразит путь, имя файла и найденную строку содержимого, которая соответствует шаблону.
Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy"
7
автор: user5000502
чтобы сохранить полную информацию о файле в результирующем массиве, вы можете использовать небольшую модификацию ответа, опубликованного vikas368 (который, похоже, не работал хорошо с автозаполнением ISE):
Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }
или короче:
ls -r | ?{ $_ | Select-String -Pattern "dummy" }
вот как я бы это сделал, вам не нужно get-content:
ls -r | Select-String dummy | select line,path
или
ls -r | Select-String dummy | fl
чтобы увидеть, каковы различные свойства…
отобразится список полного пути к каждому файлу, содержащему строку поиска:
foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}
обратите внимание, что он не отображает заголовок над результатами и не отображаются строки текста, содержащие строку поиска. Все это говорит вам, где вы можете найти файлы, содержащие строку.
3
автор: Little Girl
Если вы ищете в одном каталоге, вы можете сделать это:
select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path
3
автор: Esperento57
Работа с файлами при помощи команд PowerShell | Windows IT Pro/RE
Windows PowerShell предоставляет пользователям четыре способа работы с файлами.
- Применение составных команд. Существует ряд команд, созданных специально для работы с файлами. При помощи этих команд вы можете управлять файлами и путями к файлам так, как если бы работали с содержанием файлов.
- Применение команд DOS. PowerShell полностью совместим с командами DOS. Таким образом, то, что вы можете сделать при использовании DOS, вы можете сделать и при помощи PowerShell. PowerShell признает даже команду xcopy.
- Использование инструментария управления Windows Management Instrumentation (WMI). WMI предлагает иной механизм для управления файлами (например, изменение файловых свойств, поиск или переименование файла). Лучше всего запускать команды WMI в удаленном режиме.
- Применение методов Microsoft. NET Framework. Пространство имен. NET System.IO доступно через командную строку PowerShell. Эта строка включает в себя классы System.IO.File и System.IO.FileInfo.
В данной статье я расскажу о командах, которые были созданы специально для файлов. Вот те команды, которые вы можете использовать для работы с файлами:
Get-ChildItem Get-Item Copy-Item Move-Item New-Item Remove-Item Rename-Item
Использование Get-ChildItem
Команда Get-ChildItem возвращает элементы, обнаруженные в одном или нескольких указанных местах. Местоположение может быть контейнером файловой системы, таким как каталог, или местом, показанным другим провайдером, таким как подраздел реестра или хранилище сертификатов. Вы можете задействовать параметр Recurse данной команды, чтобы добраться до элементов во всех подпапках.
Если использовать эту команду без параметров, она возвращает все дочерние элементы (такие как подпапки и файлы) в текущем местоположении. Например, если текущее местоположение – корневой каталог H, то запуская команду Get-ChildItem, вы получите результаты, похожие на те, что показаны на экране 1.
Экран 1. Результаты работы Get-ChildItem |
Используя параметры, вы можете получить информацию, которая вам нужна. Например, следующая команда возвращает все файлы. log в корневом каталоге C, включая подкаталоги:
Get-ChildItem C:\* -Include *.log -Recurse -Force
Как мы видим, эта команда использует параметры -Include, -Recurse и –Force. Параметр –Include служит для возвращения заданных элементов. Он поддерживает использование групповых символов и является идеальным для указания расширения имени файла. Параметр –Recurse дает PowerShell указание возвращать подпапки наряду с файлами. Параметр –Force добавляет скрытые и системные файлы к выходным данным.
После запуска этой команды вы, вероятно, получите обширный список сообщений об ошибках доступа. В зависимости от настроек и политик безопасности системы, доступ к некоторым каталогам (например, Recycle Bin, Start Menu, пользовательские папки) ограничен и их нельзя прочитать. Вы можете скрыть эти сообщения об ошибках, указав параметр -ErrorAction SilentlyContinue.
Следующая команда дает те же результаты, что и предыдущая, потому что параметр –Path понимает групповые символы:
Get-ChildItem -Path C:\*.log -Recurse -Force
Для некоторых параметров команд PowerShell имя параметра вы можете опустить, если знаете, что параметр находится в той позиции, которая нужна PowerShell. Так происходит при использовании параметра –Path команды Get-ChildItem. Таким образом, следующая команда выдаст тот же результат, что и предыдущая команда:
Get-ChildItem C:\*.log -Recurse -Force
Параметр –Path может принимать множественные аргументы, разделенные запятыми. Например, предположим, что вы хотите возвратить. log-файлы из двух мест: корневого каталога С и корневого каталога Н, последний является текущим (то есть местоположением по умолчанию). Для выполнения этого действия нужно указать значение C:\* для получения всех файлов журналов из корневого каталога С и значение * для получения всех файлов журналов из корневого каталога Н (поскольку корневая папка Н является местоположением по умолчанию, вам не нужно указывать H:\.). Необходимо разделить два аргумента запятой, например так:
Get-ChildItem C:\*, * -Include *.log -Force
В результатах примера на экране 2 обратите внимание на атрибут «h» в колонке Mode корневого каталога Н. Этот атрибут показывает, что файл ntuser.dat.LOG является скрытым. Это обнаруживается при помощи параметра –Force.
Экран 2. Вывод скрытых файлов |
Хотя в примерах это и не показано, вы можете обратиться к Get-ChildItem при помощи дополнительных имен, псевдонимов. Вот три встроенных псевдонима: dir (как в DOS команда dir), gci и ls (как команда ls в UNIX).
Использование команды Get-Item
Команда Get-Item возвращает заданные элементы из назначенных местоположений. Как и ChildItem, Get-Item может применяться для навигации по различным типам хранилищ данных. В отличие от Get-ChildItem, Get-Item не имеет местоположения по умолчанию, поэтому вы должны всегда предоставлять, как минимум, одно местоположение с помощью параметра –Path. Хотя сам параметр и нужен, указывать имя параметра не требуется. Например, вот простая команда, которая использует «точку» для возвращения информации о текущем каталоге (в данном случае корневая папка Н):
Get-Item.
Результаты показаны на экране 3. Команда Get-Item позволяет задействовать групповой символ * для возвращения всего содержимого элемента (то есть всех дочерних элементов). Например, следующая команда возвращает весь контент текущего каталога (в данном случае корневого каталога Н). Точка и символ звездочки могут быть использованы как компоненты в пути файла, но вы должны еще указать косую черту как разделитель папок:
Get-Item. \*
Экран 3. Использование Get-Item для вывода информации о текущей папке |
Результаты вы можете увидеть на экране 4. Важно понимать, что команды PowerShell, включая Get-Item, возвращают объекты. Команда Get-Item возвращает объекты System.IO.DirectoryInfo, которые содержат несколько методов и свойств, которые вы можете использовать. Чтобы увидеть эти методы и свойства, можно передать результаты команды Get-Item в команду Get-Member. Если вы хотите увидеть эти свойства, можете запустить такую команду:
Get-Item. | Get-Member -MemberType Property
Экран 4. Использование Get-Item для вывода всего содержимого текущей папки |
Как показано на экране 5, свойство LastAccessTime возвращает дату и время, когда к указанному каталогу был в последний раз осуществлен доступ.
Экран 5. Изучение свойств объекта System.IO.DirectoryInfo |
Например, если вы хотите выяснить, когда к текущему каталогу был осуществлен доступ в последний раз, вы запускаете команду:
(Get-Item. ).LastAccessTime
Заметим, что в этой команде вызов Get-Item. заключен в круглые скобки и что между закрывающей круглой скобкой и LastAccessTime стоит точка. Круглые скобки вокруг вызова «Get-Item. » нужны для того, чтобы возвращенные объекты сохранялись в памяти и вы могли бы выполнять с ними дополнительные операции. В этом случае операцией является поиск возвращаемого значения свойства LastAccessTime объекта. В PowerShell вы используете символ точки для получения доступа к ряду свойств объекта и методов. Вот почему следует вставить точку между закрывающейся скобкой и LastAccessTime.
Существует коллекция специальных свойств, которая называется NoteProperty. Вы можете применять ее для того, чтобы сузить выводимые результаты для определенного типа объекта. Вы можете использовать Get-Member с параметром -MemberType NoteProperty, чтобы узнать о специальных свойствах этой коллекции:
Get-Item. | Get-Member -MemberType NoteProperty
Если вы запустите эту команду, то обнаружите, что коллекция возвращает шесть свойств: PSChildName, PSDrive, PSIsContainer, PSParentPath, PSPath и PSProvider. Свойство PSIsContainer коллекции NoteProperty показывает, является ли объект контейнером (папкой). Свойство возвращает True, когда объект является папкой, и False, когда он является файлом. Вы можете использовать это свойство для ограничения вывода Get-Item папками:
Get-Item C:\* | Where-Object { $_.PSIsContainer }
Давайте обсудим эту команду подробнее. Ее результаты показаны на экране 6. Вы передаете по конвейеру весь контент корневого каталога С команде Where-Object, которая позволяет отфильтровать объекты. В этом случае вы используете PSIsContainer из NoteProperty для фильтрации выходных данных, и, таким образом, возвращаются только каталоги. Автоматическая переменная $_ представляет каждый файловый объект, как только он передается команде по конвейеру.
Экран 6. Ограничение вывода команды Get-Item только папками |
Как и в случае с Get-ChildItem, вы можете обращаться к Get-Item по дополнительному имени. У Get-Item есть одно встроенное дополнительное имя: gi.
Использование Copy-Item
Команда Copy-Item является реализацией в PowerShell команды copy bp DOS и команды cp из UNIX. Но помимо этого, Copy-Item сконструирован для работы с данными, выдаваемыми любым провайдером. Первыми двумя параметрами команды являются -Path (вы используете его для указания элемента, который хотите скопировать) и –Destination (вы применяете его для указания места, в которое хотите скопировать этот элемент). Они позиционные, поэтому имена параметров можно опустить. Например, следующая команда копирует файл test.txt из папки C:\Scripts в папку C:\Backups\Scripts:
Copy-Item C:\Scripts\test.txt C:\Backups\Scripts
Параметр –Path принимает групповые символы, поэтому вы можете копировать несколько файлов сразу. Например, следующая команда копирует все файлы в папке C:\Scripts в папку C:\Backups\Scripts:
Copy-Item C:\Scripts\* C:\Backups\Scripts
Чтобы получить более детальное управление операцией копирования, вы можете задействовать параметры -Recurse, -Filter и –Force. Так, следующая команда копирует все файлы. txt, содержащиеся в C:\Scripts в C:\Temp\Text:
Copy-Item -Path C:\Scripts -Filter *.txt -Recurse ` -Destination C:\Temp\Text
Обратите внимание, что «обратная кавычка» в конце первой строки является символом продолжения строки в PowerShell.
Немного освоившись, вы можете вставить свойство FullName в параметр –Path для копирования тщательно отобранного списка файловых объектов, используя либо Get-Item, либо команду Get-ChildItem:
Get-ChildItem C:\* -include *.txt | Where-Object { $_.PSIsContainer -eq $false -and ` $_.LastAccessTime -gt ($(Get-Date).AddMonths(-1))} | ForEach-Object { Copy-Item $_.FullName C:\Temp}
На самом деле это предложение является комбинацией трех отдельных команд. Первая команда (то есть команда в первой строке) возвращает все файлы. txt в корневом каталоге С. Вторая команда (команда во второй и третьей строках) вычленяет список текстовых файлов таким образом, что содержит только те файловые объекты, чье свойство LastAccessTime больше, чем месяц назад. Третья команда (команда в последней строке) вставляет каждое файловое имя в свойство –Path, располагающееся в Copy-Item, используя команду ForEach-Object. Слишком сложно для вас? Тогда можете принять входные данные по конвейеру. Только убедитесь, что вы указали имя параметра –Destination так, чтобы Copy-Item знала, что делать с этими входными данными, так как данный параметр находится не в ожидаемой позиции:
Get-ChildItem C:\* -Include *.log | Copy-Item -Destination C:\Temp
Хотя в наших примерах это и не показано, вы можете обратиться к Copy-Item через дополнительные имена. Существует три псевдонима: copy, cp, cpi.
Использование Move-Item
Move-Item очень похожа на Copy-Item. Фактически, если вы заменяете Copy-Item на Move-Item в любой из команд, представленных в предыдущем разделе, команды будут вести себя во многом так же, за исключением того, что исходные файлы будут удалены в исходную папку.
Однако есть одно важное различие. Если вы запустите одну и ту же команду Copy-Item дважды, то обнаружите, что PowerShell переписывает существующий файл в папку назначения без какого-либо предупреждения.
Move-Item более осторожна в этом смысле и вместо удаления выдает ошибку. Например, если вы запускаете команду
Get-ChildItem C:\* -Include *.txt | Where-Object ` { $_.LastAccessTime -gt ($(Get-Date).AddMonths(-1))} | ForEach-Object { Move-Item $_.FullName C:\Temp}
то получите ошибку Cannot create a file («нельзя создать файл»), так как файл уже существует. Использование параметра –Force приводит к тому, что Move-Item переписывает существующий файл.
Помимо параметра –Force, вы можете задействовать параметры Recurse и –Filter в команде Move-Item, чтобы настраивать ее. Например, следующая команда перемещает текстовые файлы в папке C:\Scripts и ее подпапках в папку C:\Temp\Text. В данном случае вам нужно указать имя параметра –Destination, поскольку вы не используете этот параметр в той позиции, где его ожидает PowerShell:
Move-Item C:\Scripts -Filter *.txt -Recurse ` -Destination C:\Temp\Text
Как и Copy-Item, Move-Item имеет три псевдонима: move, mv и mi.
Использование New-Item
New-Item играет двойную роль — создателя каталога и файла (кроме того, она может создавать разделы и параметры реестра). Когда вы хотите создать файл, вам нужно указать параметры –Path и –ItemType. Как было показано выше, параметр –Path является позиционным, таким образом, не требуется имя параметра –Path, когда вы задаете путь и имя (то есть путь к файлу) сразу же после имени команды. Также следует указать параметр –ItemType при помощи флажка»file«. Вот пример:
New-Item 'C:\Documents and Settings\Nate\file.txt' ` -ItemType»file«
Параметр –Path может принимать массив строк так, что вы можете создавать несколько файлов за раз. Вам просто нужно разделить пути при помощи запятых. Вдобавок, необходимо вставить сначала параметр -ItemType»file«, который означает, что вам нужно указать имя параметра –Path, поскольку он теперь не первый параметр после имени команды:
New-Item -ItemType»file«-Path»C:\Temp\test.txt«, ` »C:\Documents and Settings\Nate\file.txt«, ` »C:\Test\Logs\test.log«
Если файл с точно таким же именем пути файла уже существует, вы получите ошибку. Однако вы можете указать параметр –Force так, что New-Item перепишет существующий файл.
Что на самом деле примечательно, так это то, что New-Item позволяет вставлять текст в файл посредством параметра –Value:
New-Item 'C:\Documents and Settings\Nate\file.txt' ` -ItemType»file«-Force ` -Value»Here is some text for my new file.«
Не забудьте указать параметр –Force, если файл уже существует. Иначе система выдаст ошибку.
Параметр –Value может принимать ввод данных по конвейеру, что является отличным способом перенаправлять вывод данных других команд в файл. Вам нужно просто конвертировать выходные объекты в строку, используя Out-String (если вы этого не сделаете, New-Item создаст новый файл для каждого объекта). Например, следующая команда возвращает информацию обо всех файлах из корневого каталога С, конвертирует информацию о файлах в строку, а затем пишет эту информацию в файл H:\C Listing.txt:
Get-ChildItem C:\* | Out-String | New-Item -Path»H:\C Listing.txt«-ItemType»file«-Force
New-Item имеет только одно встроенное дополнительное имя: ni.
Использование Remove-Item
Remove-Item навсегда удаляет ресурс с указанного диска, то есть она не перемещает его в корзину. Таким образом, если вы используете Remove-Item для удаления файла, то нет иного способа вернуть его, кроме как через программу восстановления файлов.
Вы указываете, какой файл должна удалять Remove-Item при помощи параметра –Path. Он позиционный, поэтому вам не нужно указывать имя параметра –Path, если оно идет сразу же за именем команды. Например, вот команда для удаления файла test.txt, который был ранее скопирован в папку C:\Backups\Scripts:
Remove-Item»C:\Backups\Scripts\test.txt«
Давайте рассмотрим другой пример. Следующая команда удаляет все файлы. txt (что указано в параметре –Include) в папке C:\Scripts, кроме тех файлов, которые имеют слово test где-либо в файловом имени (что указано в параметре –Exclude):
Remove-Item C:\Scripts\* -Include *.txt -Exclude *test*
Будучи, по сути, опасным инструментом, Remove-Item предоставляется с парой элементов защиты. Прежде всего, если вы пытаетесь удалить все из папки, которая содержит непустые подпапки, вы получите запрос на подтверждение Confirm. Например, предположим, что C:\Scripts содержит непустые подпапки и вы запускаете такую команду:
Remove-Item C:\Scripts\*
Нужно подтвердить, что вы хотите удалить непустые подпапки, как показано на экране 7.
Экран 7. Запрос на подтверждение удаления при использовании Remove-Item |
Если вы хотите запустить сценарий, который использует Remove-Itemм для удаления всего содержимого папок, включая содержимое подпапок, вам нужен способ запускать Remove-Item без участия пользователя. Этот способ – включение флажка –Recurse.
Второй элемент защиты – это параметр –WhatIf. Если вы включаете его в команду Remove-Item, то PowerShell покажет, какие элементы будут удалены, вместо того, чтобы просто удалить их. В силу деструктивной природы операций удаления, имеет смысл выполнять пробное применение команды Remove-Item с параметром –WhatIf, как здесь:
Remove-Item c:\* -Recurse -WhatIf
Результаты примера показаны на экране 8. Заметьте, что результаты могут включать в строку сообщение об ошибке Cannot remove the item at ‘C:\Users’ because it is in use. Такая ситуация возникает, если текущая рабочая папка является подпапкой каталога, которую вы пытаетесь удалить (в примере – подпапка корневого каталога С).
Экран 8. Применение Remove-Item с параметром -WhatIf Parameter |
Что касается дополнительных имен, то Remove-Item стоит особняком. У него шесть псевдонимов: del, erase, rd, ri, rm и rmdir.
Использование Rename-Item
Команда Rename-Item используется, когда вы хотите переименовать ресурс внутри пространства имен, предоставленного провайдером PowerShell. Первый параметр Rename-Item – это –Path, а второй параметр -NewName. Параметр –NewName, как и следовало ожидать, задает новое имя ресурса. Если Rename-Item обнаруживает не только имя, но и путь, он выдаст ошибку. Например, если вы хотите сменить имя файла C Listing.txt из корневого каталога Н на имя c_listing.txt, вам потребуется запустить такую команду:
Rename-Item -Path»H:\C Listing.txt«-NewName c_listing.txt
Поскольку -Path и -NewName являются позиционными параметрами, вы можете пропускать имена параметров до тех пор, пока они находятся в ожидаемых позициях:
Rename-Item»H:\C Listing.txt" c_listing.txt
У Rename-Item есть одно ограничение – параметр –NewName ожидает одной строки без групповых символов. Однако вы можете обойти это требование, перечисляя элементы в каталоге. Вам нужно просто направить по конвейеру выходные данные команде Get-ChildItem в параметр –Path и указать параметр –NewName.
Например, следующая команда перечисляет все файлы в текущем каталоге и переименовывает каждый файл, заменяя все пробелы в файловых именах на подчеркивания:
Get-ChildItem * | Where-Object {! $_.PSIsContainer } | Rename-Item -NewName { $_.name -replace ' ','_' }
Давайте посмотрим, как работает эта команда. Выходные данные Get-ChildItem попадают в Where-Object, которая фильтрует выходные данные так, что возвращаются только файлы. Это достигается путем использования PSIsContainer из NoteProperty с логическим оператором -not (!) (в качестве альтернативы вы могли бы взять $_.PSIsContainer -eq $false, как это было сделано в предыдущем примере). Отфильтрованные выходные данные (файловые объекты) попадают в Rename-Item. Значение параметра –NewName в Rename-Item является блоком сценария. Этот блок будет выполнен перед командой Rename-Item. В блоке сценария автоматическая переменная $_ представляет каждый файловый объект, так как он попадает в команду через контейнер. Оператор сравнения –replace заменяет пробелы в каждом имени файла (‘ ‘) на символ подчеркивания (‘_’). Заметьте, что вы можете использовать выражение ‘\s’ для указания пробела, поскольку первый параметр принимает регулярные выражения. Даже скрытые файлы могут быть переименованы благодаря параметру –Force.
Rename-Item имеет два псевдонима: ren и rni.
Великолепная семерка
В данном руководстве я познакомил вас со способами взаимодействия PowerShell с файлами. В частности, мы изучили встроенные команды PowerShell, предназначенные для работы с файлами. Это Get-ChildItem, Get-Item, Copy-Item, Move-Item, New-Item, Remove-Item и Rename-Item.
Поделитесь материалом с коллегами и друзьями
Получение содержимого файла в Powershell с Get-Content на примерах
Для открытия файлов и чтения его содержимого используется команда Powershell Get-Content. В этой статье рассмотрим работу команды с открытием файла, построчным чтением, поиском по содержимому строки на примерах.
Для открытия файла ‘C:\text.txt’ можно использовать следующую команду:
Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts'
Если у вас множество файлов или вы не уверены в назывании, то вы можете использовать подстановку. Символы подстановок бывают следующих типов:
- ‘*’ — говорит об неизвестном количестве символов;
- [a,b] — говорит, что в этом месте может быть буква ‘a’ или ‘b’;
- ? — обозначает один неизвестный символ.
Каждый из символов выше можно применять вместе и неограниченное число раз, в любой части пути и имени.
В этом примере я открою сразу два файла: lmhosts и hosts:
Get-Content -Path 'C:\Windows\System32\drivers\etc\*st*'
Следующие примеры вернут аналогичный результат:
Get-Content -Path 'C:\Windows\System32\drivers\etc\[l,h]*ost*'
Get-Content -Path 'C:\Windows\System32\drivers\etc\*h?st*'
Для похожей фильтрации есть следующие параметры, которые так же позволяют использовать символы подстановок:
- Include — в этом параметре мы добавляем шаблон, по которому будем включать файл;
- Exclude — с помощью этого параметра исключает файлы;
- Filter — исключает результаты.
Для каждого из этих параметров есть обязательно условие — использовать знак ‘*’ в конце пути.
Так мы вернем все файлы с расширением ‘.txt’:
Get-Content -Path 'C:\*' -Filter '*.txt'
В отличие от Filter, в Include и Exclude мы можем использовать несколько значений. В этом примере мы откроем файлы формата ‘.txt’ и ‘.ini’:
Get-Content -Path 'C:\*' -Include '*.txt','*.ini'
Полное и построчное чтение с поиском
По умолчанию, если мы будем передавать результат команды через конвейер Powershell вывод будет построчный. Это может составить проблему, так как при дополнительных условиях у нас будет возвращаться одна строка, а не весь текст:
Get-Content -Path 'C:\file*.txt' | Select-String -Pattern 'Line 8'
Что бы текст передавался полностью, а не построчно — используйте параметр Raw:
Get-Content -Path 'C:\file*.txt' -Raw | Select-String -Pattern 'Line 8'
Если вам вдруг понадобится выводить по 2 или более строк за раз, можно указать их количество через ReadCount:
Get-Content -Path 'C:\file*.txt' -ReadCount 2 | Select-String -Pattern 'Line 8'
Разделение файла
Файл выводится построчно из-за делиметра (разделителя), который по умолчанию равен ‘\n’ (идентификатор новой строки). Мы можем разделить файл иначе, например, использовав точку с запятой:
Get-Content -Path 'C:\delimiter.txt' -Delimiter ';'
То есть результат выше — это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:
$content = Get-Content -Path 'C:\delimiter.txt' -Delimiter ';'
# Выведем первый элемент
$content[0]
# Уберем разделитель во всех адресах
foreach ($c in $content){
$c -replace ';',''
}
Подсчет количества строк
Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:
Get-Content -Path 'C:\file.txt' | measure
Если нужна только цифра, а не объект, можно сделать так:
(Get-Content -Path 'C:\file.txt' | measure).Count
Кодировки
В параметре -Encoding можно указать следующие кодировки:
- ASCII
- BigEndianUnicode
- BigEndianUTF32
- Byte
- Default
- OEM
- Unicode
- UTF7
- UTF8
- UTF32
В этом командлете не предусмотрена возможность открытия файла под другим пользователем. При любых попытках вы будете получать ошибки:
- Access to the path is denied
- The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again withoutspecifying credentials.
Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.
Сам процесс открытия файла под другим пользователем будет выглядеть так:
# Вводим свои учетные данные
$creds = Get-Credential
# Выполняем запрос под другим пользователем
Invoke-Command -Computer localhost -Credential $creds -ScriptBlock {Get-Content -Path 'C:\Folder\File2.txt'}
С помощью параметра Wait вы можете читать файл, который в этот момент обновляется системой или другим пользователем:
Get-Content -Path 'C:\file1.txt' -Wait
Можно ограничить вывод содержимого файла указав количество нужных строк в начале или конце:
- Head — выведет указанное количество строк с начала;
- Tail — выведет указанное количество строк с конца.
Так будут выведены только первые 5 строк:
Get-Content -Path 'C:\file1.txt' -Head 5
Get-Content не позволяет искать и открывать фалы находящиеся внутри других каталогов. Такой поиск называется рекурсивным и он доступен в Get-ChildItem.
В следующем примере мы вернем файлы из всех каталогов и подкаталогов:
Get-ChildItem -Path 'C:\Windows\' -Recurse -File
File — возвращает только файлы. Каталоги нам не нужны.
С Get-ChildItem вы так же можете использовать Include,Exclude и Filter, которые были рассмотрены раннее. Использовать эти ключи лучше всего в первой команде т.к. это будет работать быстрее.
Через конвейер мы сможем открыть каждый файл, а с Select-Sting проверить есть ли в нем нужный текст. Так мы найдем файл с Powershell, который содержит строку ‘127.0.0.1’ в папке Windows:
Get-ChildItem -Path 'C:\Windows\System32\drivers\etc\' -Recurse -File |
Get-Content -Raw |
Select-String '127.0.0.1'
Если убрать параметр Raw, то у нас выведется только та строка, которую мы искали:
Вы так же можете изменить содержимое файла и перезаписать этот файл. Представим, что вам нужно заменить адрес ‘127.0.0.1’ в строке — это можно сделать так:
'My address: 127.0.0.1/24' -replace '127.0.0.1','192.168.3.2'
Или с помощью регулярного выражения (не точный шаблон):
'My address: 127.0.0.1/24' -replace '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}','192.168.3.2'
Для записи в файл у нас есть два варианта. Первый — это использовать перенаправление в виде знака ‘>’, который перезапишет все содержимое файла или создаст новый файл:
$file_content = Get-Content -Path 'C:\file1.txt'
$file_content -replace '127.0.0.1','192.168.3.2' > file1.txt
Второй вариант — использовать команду Set-Content:
$file_content = Get-Content -Path 'C:\file1.txt'
$file_content -replace '127.0.0.1','192.168.3.2' | Set-Content -Path 'C:\file1.txt'
У меня есть файл ‘file.txt’ со следующим содержанием:
some text 123 some text 6 some
text 9 some text 312345
123.2
Шаблон регулярного выражения ‘\d*\.?\d*’ говорит, что мы ищем число, после которого может быть точка, после которого могут быть еще числа. Таким образом мы захватим целые и числа с плавающей точкой.
Для выделения таких чисел из строк нужно использовать Select-String:
$file = Get-Content -Path 'file.txt'
$result = Select-String -InputObject $file -Pattern '\d*\.?\d*' -AllMatches | Foreach {$_.matches}
Нам нужно отформатировать вывод убрав пустые строки и получить значения свойства Value:
$result | where Value -ne '' | select Value
Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:
# Открываем файл
$opened_file = Get-Content -Path 'file.txt'
# Поиск чисел
$result = Select-String -InputObject $opened_file -Pattern '\d*\.?\d*' -AllMatches | Foreach {$_.matches}
# Исключение пустых строк в выводе
$result = ($result | where Value -ne '').Value
foreach ($num in $result){
# Результат деления
$n = $num%2
if ($n -eq 0){Write-Output "Число четное: $num"}
else {Write-Output "Число не четное: $num"}
}
…
Теги:
#powershell
#файлы
Используйте Windows PowerShell для поиска файлов
Dr Scripto
Сводка : Используйте Get-Childitem для поиска файловой системы с помощью PowerShell.
Я сохранил файл где-то на своем компьютере и не могу его найти. Есть ли способ найти его с помощью Windows PowerShell?
Почетный сценарист, Шон Кирни, сегодня здесь, чтобы показать вам крутой трюк, который я использую все время. Я использую PowerShell для постоянного поиска вещей!
Почему PowerShell? Ну, честно говоря, у меня плохая, плохая, плохая привычка размещать данные там, где их быть не должно.Иногда я использовал места, которые индексатор в Windows не отслеживает. В таких ситуациях даже Кортана мне не поможет.
Мы можем использовать Get-Childitem , чтобы довольно легко показать список файлов и / или каталогов. В следующем примере перечислены все файлы в корне диска C:
Get-Childitem –Path C: \
Если мы добавим параметр –Recurse , мы сможем показать все , к которым у нас есть доступ.
Get-Childitem –Path C: \ -Recurse
Пока что это не отличается от выполнения следующей команды в командной строке CMD.
Dir C: \ *. * / S
Итак, почему именно PowerShell?
Для поиска PowerShell предлагает нам все то, что не видит под капотом. В этой структуре папок обязательно будет много файлов, к которым я не могу получить доступ. Это вызовет ошибку (по умолчанию красный) и сделает очень трудным для чтения.
Итак, мы говорим PowerShell: «Не показывай мне эти незначительные ошибки, просто продолжай».
Get-Childitem –Path C: \ -Recurse -ErrorAction SilentlyContinue
Но как мы можем использовать это в качестве инструмента поиска? Get-Childitem включает два дополнительных параметра: — включить и — исключить .Их функции довольно просты.
Параметр -include говорит: «Показывать мне только эти файлы в поиске», а -exclude говорит: «Держите это подальше от меня».
Как говорил человек по телевизору: «Но подождите! Есть больше!». Иногда причина того, что вы не можете найти файл, заключается в том, что он хранился во временной папке Outlook.
Этот водил меня бананами! Поскольку Temporary — это скрытая папка, вы часто ее пропустите, как и Get-Childitem .Чтобы обойти эти проблемы, добавьте параметр –force , чтобы он также мог проверять эти папки.
Get-Childitem –Path C: \ -Recurse –force -ErrorAction SilentlyContinue
Теперь мы можем использовать ту же команду , чтобы показать только документы Word, к которым я могу получить доступ, или, возможно, даже все файлы, вставьте буквы HSG. Да, есть вероятность, что я слишком много смотрел Вавилон 5 и сохранил файл в папке «Изображения».
Get-Childitem –Path C: \ -Include * HSG * -Recurse -ErrorAction SilentlyContinue
К сожалению, он подтягивает все, я имею в виду все .с буквами HSG, включая названия папок. Мы можем указать ему, чтобы он отображал только файлов с помощью PowerShell. Это было введено в версии 3 PowerShell.
Get-Childitem –Path C: \ -Include * HSG * -File -Recurse -ErrorAction SilentlyContinue
Мы также можем использовать параметр -Exclude , чтобы сказать: «Не показывать мне файлы TMP, MP3. , или файлы JPG .:
Get-Childitem –Path C: \ -Include * HSG * -Exclude * .JPG, *. MP3, *. TMP -File -Recurse -ErrorAction SilentlyContinue
Вот где все действительно получился мощный.Перейдем непосредственно к мелочам. Представьте, что это действительно длинные выходные.
Вы сделали работу в пятницу. Вы даже забыли имя файла! Как же отсортировать от ?
В PowerShell мы можем довольно легко фильтровать файлы по дате и времени.
А сейчас давайте возьмем дату на 24 июня 2016 года. Я не планирую, что это будут длинные выходные, но, эй, я, , мог бы заболеть в понедельник, так что это возможно 😉
делаю это, но я собираюсь использовать Get-Date , потому что он работает на международном уровне.Сначала укажите год, месяц и день.
$ FindDate = Get-Date -Год 2016 -Месяц 06 -День 24
Обладая этой информацией, я могу сначала выделить две вещи. Во-первых, покажите мне все мои документы Word, только файлы, на всем диске C: и сохраните сообщения об ошибках при себе, PowerShell.
Get-ChildItem -Path C: \ -Include * .doc, *. Docx -File -Recurse -ErrorAction SilentlyContinue
Теперь я могу использовать Where-Object , чтобы отображать только файлов, которые были созданы с с день, который я сохранил в $ FindDate .Это будет включать все, начиная с 12:00 утра этого дня. Мы сравним список со свойством LastWriteTime , которое является «последней записью в файл».
Get-ChildItem -Path C: \ -Include * .doc, *. Docx -File -Recurse -ErrorAction SilentlyContinue | Where-Object {$ _. LastWriteTime -ge $ FindDate}
Эй, подожди. В выходные я немного поработал. Я хочу только пятницу! Что ж, мы можем отфильтровать и это, используя метод AddDays () для нашей даты и присвоив ему диапазон 24 часа!
Get-ChildItem -Path C: \ -Include *.doc, *. docx -File -Recurse -ErrorAction SilentlyContinue | Where-Object {$ _. LastWriteTime -ge $ FindDate -and $ _. LastWriteTime -le $ Finddate.adddays (1)}
Конечно, большинству людей может потребоваться поиск только в нескольких местах. Get-Childitem можно даже сказать «Искать только в этом списке папок». В следующем примере я собираюсь выполнить поиск в папке C: \ Users, в папке HSG на моем USB-ключе (диск L 🙂 и в папке с именем «Whoops \ Not \ This \ One» на диске X:
Get-Childitem -Path C: \ Users, L: \ HSG, X: \ Whoops \ Not \ This \ One -Include HSG *.док? -Recurse
Я надеюсь, что это помогло вам сегодня и расширило ваши возможности в ваших повседневных задачах.
Я приглашаю вас подписаться на «Scripting Guys» в Twitter и Facebook. Если у вас есть какие-либо вопросы, отправьте им электронное письмо по адресу [email protected] или разместите свои вопросы на официальном форуме Scripting Guys. До завтра.
До тех пор всегда помните, что с Great PowerShell приходит большая ответственность.
Шон Кирни Почетный сценарист
Управление облаком и центрами обработки данных MVP
Dr Scripto
Скриптер, PowerShell, vbScript, BAT, CMD
.
Используйте команду Easy PowerShell для поиска информации в файлах
Dr Scripto
Сводка : Узнайте, как использовать команду Windows PowerShell для удобного поиска информации в коллекции файлов.
Привет, сценарист! Мне нужно иметь возможность анализировать несколько файлов на предмет текста, который находится в одной папке. Я ненавижу писать сценарий для такой типичной задачи, но боюсь, что мне придется это сделать. Можешь мне помочь?
—SH
Здравствуйте, SH,
Microsoft Scripting Guy Ed Wilson здесь.На этой неделе мы с женой-сценаристом пытаемся разобраться во всем, прежде чем мы уедем в Корпус-Кристи, штат Техас, где я буду вести класс Windows PowerShell. Кроме того, мы будем присутствовать на первом собрании группы пользователей PowerShell Корпуса Кристи. Если вы будете в Южном Техасе 9 августа 2011 года, вам стоит его проверить. Это должно быть очень весело. О, кстати, сегодня я провожу встречу с группой пользователей Lincoln SQL Server (ssug). Встреча будет доступна через Live Meeting.Такое ощущение, что эта неделя началась поздно и закончится рано. К счастью, SH, ответ на ваш вопрос — нет, вам не нужно писать скрипт для анализа папки, полной файлов, на предмет определенной строки. Фактически, это была тема, которая была протестирована в мероприятии для начинающих 6 в Скриптовых играх 2011 года.
Решение — использовать командлет Select-String . Следует иметь в виду, что командлет Select-String читает текстовые файлы; он не может читать более сложные типы файлов, такие как.файлы .doc и .docx, создаваемые Microsoft Word. Когда я попытался выполнить поиск в папке, содержащей документы Word и изображения, которые составили типичный «Эй, сценарист!» Сообщение в блоге, Windows PowerShell отобразила в консоли кучу тарабарщины, а затем заблокировалась. Это показано на следующем рисунке.
Самый простой способ избежать появления тарабарщины — это указать типы файлов, которые нужно искать. Например, если я хочу найти во всех текстовых файлах в каталоге c: \ fso шаблон ed (например, мое имя), я включаю подстановочный знак в свою спецификацию пути и выбираю любой файл с расширение файла. txt. Преимущество командлета Select-String заключается в том, что он ожидает, что путь , а также параметр шаблона будут строками, поэтому мне не нужно использовать кавычки ни для шаблона, ни для пути. Я могу использовать следующую команду для поиска в папке c: \ fso файлов с расширением. txt и содержат совпадение с шаблоном для ed :
Select-String -Path c: \ fso \ *. Txt -pattern ed
Команда и связанные выходные данные показаны на следующем рисунке.
Если я использую командлет Get-Command ( gcm — это псевдоним для этого командлета) для проверки синтаксиса командлета Select-String , я вижу, что путь и шаблон Параметры будут принимать массив строк. Это означает, что я могу использовать трюк с подстановочными знаками с расширениями файлов, чтобы искать несколько файлов одновременно. Чтобы изучить только синтаксис командлета Select-String , я использовал командлет Get-Command и передал выходные данные командлету Select-Object ( select — псевдоним).Затем я решил расширить определение свойство . Полученная команда показана здесь:
gcm select-string | select -expand definition
Команда и связанные выходные данные показаны на следующем рисунке.
Поскольку я могу предоставить массив строк для параметра path , я могу искать и то, и другое. log файлов и. txt файлов одновременно. В моей измененной команде Select-String я ищу оба файла в папке c: \ fso. txt и. журнал файлов. Я заглядываю внутрь обоих типов файлов в поисках совпадения по образцу ed. Измененная команда показана здесь:
Select-String -Path c: \ fso \ *. Txt, c: \ fso \ *. Log -pattern ed
Команда и связанный с ней вывод показаны на следующем рисунке.
Поскольку параметр шаблона также принимает массив строк, я также могу выполнять поиск в. txt и расширение. log файлов для строк ed и teresa .Команда для поиска обоих файлов в папке c: \ fso. txt и для. log файлов, и поиск совпадений шаблонов с ed и teresa показан на следующем рисунке.
В дополнение к прямому использованию параметра path в командлете Select-String , может быть проще использовать командлет Get-Childitem для более детального контроля над файлами для анализа. В следующей команде я использую команду dir (псевдоним для командлета Get-ChildItem ) и указываю путь к c: \ fso (путь не отображается в команде, поскольку это параметр по умолчанию ).Включаю только. txt и. log файлов (я использую –I и полагаюсь на завершение параметра, чтобы указать параметр include . Я делаю то же самое с переключателем recurse (в этом случае я просто использую букву r ). направьте результаты в командлет Select-String и найдите шаблон fail ( шаблон является параметром по умолчанию и поэтому опускается в команде). Здесь показана длинная версия команды:
Get- ChildItem -Path c: \ fso -Include *.txt, * .log -Recurse | Select-String -Pattern fail
Вот пример сокращенной формы команды.
каталог c: \ fso -I * .txt, * .log -R | Ошибка Select-String
Здесь показаны команда и связанные выходные данные.
Интересно, что приведенные выше выходные данные отображают информацию из файла install.log и показывают множество сбоев. Я решаю, что хочу видеть как успехи, так и неудачи. Я изменяю команду, добавляя к шаблону слово success .Измененная команда показана здесь:
dir c: \ fso -I * .txt, * .log -R | Select-String fail, success
Когда я просматриваю выходные данные предыдущей команды, я вижу, что появляется шаблон: на всех серверах установка не удалась. На клиентских компьютерах установка прошла успешно. Но в выходных данных мне не хватает компьютеров с Windows XP. Я решаю добавить слово в ожидании к моему массиву условий поиска. Вот измененная команда:
dir c: \ fso -I *.txt, * .log -R | Select-String fail, success, pending
Команда и связанные выходные данные показаны на следующем рисунке.
Ну, Ш, спасибо за вопрос. Я надеюсь, что побудил вас потратить немного больше времени на изучение командлета Select-String .
Я приглашаю вас подписаться на меня в Twitter и присоединиться к Scripting Guys на Facebook. Если у вас есть какие-либо вопросы, отправьте мне письмо по адресу [email protected] или разместите свои вопросы на официальном форуме разработчиков сценариев.До завтра. А пока мир.
Эд Уилсон, Microsoft Scripting Guy
Dr Scripto
Скриптер, PowerShell, vbScript, BAT, CMD
.
как искать вывод порядка файлов в PowerShell
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
windows — Найдите определенные файлы .exe на компьютере с помощью PowerShell
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.