2013-10-14 3 views
1

Я хотел сделать генератор справки для всей команды в help в Windows cmd и записать его в отдельные файлы. Так вы спрашиваете /? на всех командах, которые находятся в списке при вводе help в cmd. Вот основная часть моего кода:Сгенерировать файлы справки

rem mypath - it's a folder where I put my results 
rem In help all command are written by capitals letters 
for /f "tokens=1 usebackq" %%i in (`help^|findstr /B /R "[QWERTYUIOPASDFGHJKLZXCVBNM][QWERTYUIOPASDFGHJKLZXCVBNM]"`) do (
    if NOT "%%i"=="GRAFTABL" (
    if NOT "%%i"=="DISKPART" (
     if NOT "%%i"=="SC" (
     help %%i > !mypath!\%%i.txt 
    ) 
    ) 
) 
) 

Я использую все последовательности из [Q..M] в моем обычном ехре, потому что есть некоторые проблемы с просто набором [AZ] Но проблема в том, что в моих файлах FOR и IF - есть помощь для команды REM. Кто-нибудь знает, почему это так? Чтобы исправить это я использую:

FOR/? >%mypath%\FOR.txt 
IF/? >%mypath%\IF.txt 

Но я не могу понять, почему это так.

ответ

1

Я не мог воспроизвести проблему, но это работало правильно для меня, и я нашел простое регулярное выражение:

@echo off 
for /f %%i in ('help^|findstr /B /R [A-Z][^^^^o]') do (
if NOT "%%i"=="GRAFTABL" (
    if NOT "%%i"=="DISKPART" (
     if NOT "%%i"=="SC" (
      help %%i > %%i.txt 
      ) 
     ) 
    ) 
) 
+0

Я до сих пор есть файл с помощью для 'FOR' и для' IF' с помощью для команда 'REM' каким-то образом. И вы могли бы объяснить свое регулярное выражение [^^^^ o] - вы инвертируете набор 4 раза? –

+0

И подсказка cmd, и регулярное выражение обрабатывают escape-последовательности, поэтому для того, чтобы получить * one * caret, одиночная каретка экранирована, затем два каретки снова экранируются. Я нашел только с [A-Z], у меня есть две дополнительные строки «For», поэтому я добавил, что для «не совпадают o как второй символ». Я попробовал [A-Z] [A-Z] для двух столиц, но он все еще соответствовал «For». Возможно, диапазоны нечувствительны к регистру, или просто ошибка. FYI, я провел ваш и мой, и у меня не было REM в файлах FOR.txt или IF.txt. Попробуйте «@echo help %% i> %% i.txt», поэтому просмотрите команды, которые вы генерируете. –

+1

Это зависит от региона. Он отлично работает на английском языке, но не будет работать на других языках. – dbenham

2

код вы вывесили в вашем вопросе дает правильный результат для меня (еще до I немного переформатировал его).

См. Why does findstr not handle case properly (in some circumstances)?, чтобы узнать, почему [A-Z] работает неправильно с FINDSTR. Полный список известных особенностей FINDSTR см. В разделе What are the undocumented features and limitations of the Windows FINDSTR command?

Лучшим способом отфильтровать имена команд является поиск строк, начинающихся по крайней мере с одного непространственного символа, за которым следует любое количество дополнительных непространственных символов, а затем 2 пробела.

Если вы хотите игнорировать определенные команды, вы можете просто использовать дополнительный FINDSTR с опцией/V.

решение становится разумным вкладыш, который можно запустить из командной строки без пакетного сценария:

for /f %A in ('help^|findstr /rc:"^[^ ][^ ]* "^|findstr /v "GRAFTABL DISKPART SC"') do @help %A >%A.txt 

Или как код, который может быть подключен к сценарию:

for /f %%A in (
    'help^|findstr /rc:"^[^ ][^ ]* "^|findstr /v "GRAFTABL DISKPART SC"' 
) do help %%A >"!mypath!\%%A.txt" 


EDIT - 2015-10-11

Первый и последние строки выхода HELP начинаются со слова For (смешанный случай), на моем английском компьютере. Это слово является действительной командой с помощью, поэтому файл FOR.TXT создается 3 раза.

Я предполагаю, что все языки используют смешанный футляр для первой и последней строки. Это не трудно уточнить FINDSTR фильтр, чтобы исключить какую-либо строку, где второй символ пробел или нижний регистр символов:

for /f %A in ('help^|findstr /rvc:"^.[abcdefghijklmnopqrstuvwxyz ]"^|findstr /v "GRAFTABL DISKPART SC"') do @help %A >%A.txt 
+0

Отличный пример, но что значит '^ [^] [^]'. Это означает исключение двух последовательных пробелов в начале строки? – Paul

+0

Нет, '[^]' означает любой символ, кроме пробела. – dbenham

+0

Моя команда помощи начинается с двух строк без пробелов в первом слове. Я не понимаю, как вы можете это исключить. – Paul

Смежные вопросы