понедельник, 4 октября 2010 г.

Старая добрая командная строка #3

Продолжаем нашу серию (сообщение #0, сообщение #1, сообщение #2)

  • findstr. Еще одно déjà vu? Почти. Эта команда действительно похожа на “find”, которую мы рассмотрели во втором выпуске “старой доброй командной строки”, однако она намного мощнее. Она даже помощнее grep. Правда. Для нее есть несколько опций вывода (номер строки в файле, только имя файла, смещение и так далее), ввода (список файлов из файла/консоли, строка поиска из файла/консоли) и поиска (буквальный поиск, искать любое из слов или всю строку и даже регулярные выражения). Она и впрямь может быть весьма полезна, в случае, если Вам нужно произвести некий быстрый и точный поиск в нескольких файлах или выводе программы или автоматизировать несложную задачу без чрезмерного кодирования или инсталлирования PoSh или Perl туда, где он не стоит по-умолчанию. В этих случаях findstr – Ваш выбор. Давайте посмотрим несколько простых сценариев использования. На данный момент у меня есть три .txt файла в одной папке:

image

Заметьте разницу между файлами: file2.txt имеет внутри 45% вместо 40%, а file3.txt имеет пробел в начале второй строки. Давайте найдем тут слово “done”:

image

Достаточно просто, не так ли? Попробуем теперь получить немного больше информации:

image

Эта команда показывает нам, в каком файле есть слово “done”, в какой строке (2) и с каким смещением (14). Заметьте, что смещение отсчитывается до начала строки, в которой есть искомое, а не до первого его (искомого) вхождения. Теперь найдем файлы, в которых “45” стоит в начале строки:

image 

или другим способом:

image

Простая, но мощная.

  • msdt. Эта программа на самом деле запускает GUI, так что ее вряд ли можно назвать утилитой командной строки, однако, она имеет ряд параметров для запуска из CLI, так что если Вам нужно запустить у пользователя определенный набор для поиска и решения проблем, то это вполне неплохой выбор. Вот пример использования:

image

после этой команды откроется такое окно:

image

и я получу рекомендации по уменьшению энергопотребления моего ноутбука, а так же смогу автоматически все поправить. На самом деле, Вы даже можете создавать собственные наборы для решения проблем, по крайней мере, если сможете пробиться через вот эти страницы:  http://msdn.microsoft.com/en-us/library/dd323774(v=VS.85).aspx. Лично я планирую попробовать это как-нибудь… В будущем…  Smile

  • openfiles. Если нужно быстро получить информацию о файлах, открытых по сети (или локально, но это потребует некоторой подготовки), и, может быть, поместить эту информацию в файл или каким-то еще образом обработать ее, то вот оно – решение. Этот экран

image

на самом деле идентичен по содержанию этому:

image

и так же, как во втором случае Вы можете закрыть сессию

image

Вы можете сделать это в первом. Но в случае, если сессий у Вас много или очень много, возможности CLI, возможно, более практичны, потому что позволяют сделать следующее: 

image

Как несложно увидеть, мы запросили отрытые файлы и отфильтровали их с помощью “findstr” (эй, эта моя статья уже начинает помогать, не правда ли? Winking smile). Потом мы получаем ID нужной нам сессии и отключаем ее с помощью ключа /disconnect. Если у нас открыты тысячи файлов, то так сделать много удобнее, чем с помощью графического интерфейса.

Ну и хватит на сегодня, продолжение следует…

8 комментариев:

Анонимный комментирует...

Да, да. Более, чем дежавю :-) G**p?

Alexander Trofimov комментирует...

Нет, пожалуй, grep без расширений даже послабее будет ;)
Впрочем, спорить не буду, я grep в последний раз видел лет 6 назад =)

zorion комментирует...

Только я хотел порадоваться и фиг. В CMD всё работает. А в PowerShell... При запуске openfiles русские буквы отображает нормально, а дальше findstr их уже не видит. Если искать через английские буквы, то видно что он отображает русские буквы вопросиками.

Alexander Trofimov комментирует...

Да, в PoSh была такая беда. Сейчас попробую сюда Гусева затащить - пусть поможет ;)

Unknown комментирует...

А PowerShell то тут причем?
1) findstr не юникодный. Он понимает русские символы только в cp866.
2) Консоль командной строки Windows (которую используют cmd.exe и powershell.exe) не юникодная. Русские символы может отображать только если а) в региональных настройках в качестве языка для не-юникодных программ стоит русский б) используется TrueType шрифт.
3)PowerShell - полностью юникодный. В нормальной юникодной (например ISE) оболочке может отображать хоть иероглифы.
4)В PowerShell вообще не нужен findstr, Select-String куда богаче по возможностям и разумеется пооностью поддерживает юникод.

Alexander Trofimov комментирует...

Вася, спасибо за комментарии.
Однако PoSh пока не панацея. Есть еще, есть в русских селеньях и 2003 и XP... Ставить туда PoSh не всегда адекватное решение, увы. ;)

Unknown комментирует...

Почему не всегда адекватное? Если уж используется XP, то почему бы не обновлять? :)
И вообще, я про другое. Понятно что findstr полезная штука, но только не в PowerShell :)

Alexander Trofimov комментирует...

Потому что не всегда и не везде это возможно =)
с XP еще ладно, а вот на сервер далеко не все могут позволить себе поставить что-то еще =(