Команды SFK


    1        2        3        4        5        6        7        8        9        10    

Раздел 4. Text Processing - Обработка текста
addhead | addtail | count | difflines | filter | head | joinlines | linelen | load | ofilter | perline | printloop | replace | run | runloop | snapto | sort | strings | tail | xed | xex | xreplace |


Help:   Рус   |   Eng        Refer:   Рус   |   Eng  

Команда: run

Выполнение самоопределяемой команды для нескольких файлов в дереве каталогов

sfk run "your command $file [$relfile] [...]" [-yes] [-nohead] [-quiet] [...] Выполнить самоопределенную команду для каждого имени файла или каталога. В командной строке вы можете указать:

  • $file - введите полное имя файла, включая путь

  • $quotfile или $qfile - так же, как $file, но с кавычками "" вокруг

  • $relfile или $qrelfile - вставьте относительное имя файла, без пути

  • $base или $qbase - относительное базовое имя файла, без расширения

  • $ext или $qext - расширение имени файла. foo.bar.txt имеет расширение .txt

  • $path или $qpath - путь (каталог) без имени файла

  • $relpath или $qrelpath - подпуть относительно стартовой папки

  • $ufile или $upath - принудительное использование косой черты "/" в стиле Unix при выводе

  • $qufile или $qupath - объединение слэшеров и кавычек Unix

  • $since или $qsince - с опцией -sincediff: имя ссылочного файла

  • $text или $qtext - одна запись вводимого текста, аналогичная $file

  • $targ или $qtarg - с -tomake: имя целевого файла

    Всегда отдавайте предпочтение формам 'Q', а не формам без кавычек: как только появляется имя файла содержащие пробелы, например, X:\the src files\test one.txt, вам понадобятся кавычки, или вам придется вручную вставлять экранированные кавычки \" или \q (см. 3-й пример ниже).

    Вы также можете использовать $quotrelfile, $quotsince $quottext для большей ясности.

    Если вы укажете только $path выражения, будут обрабатываться только каталоги. Для команд из одной цепочки слов, таких как "+run vi", "$qfile" добавляется автоматически.

    Дальнейшая поддержка шаблонов

    -spat - активирует шаблоны косой черты, такие как \t, \q, \xnn и т.д.

    -upat - синтаксис в стиле unix с использованием # вместо $

    ПАРАМЕТРЫ

  • -yes - реально выполнить. По умолчанию это просто симуляция того, что будет сделано.
    Вы также можете ввести run. (с точкой) в качестве быстрого подтверждения

  • -nohead - не отображает текст информации [simulating:]

  • -noinfo - если вы не используете $text, sfk проверяет имена входных файлов
    1. Если они содержат пробелы, но в команде не указаны кавычки.
    2. Если кажется, что они используют неправильный символ разделителя пути.
    В обоих случаях выводится напоминание. Если вы знаете, что ваша команда не нуждается в изменениях, добавьте -noinfo или используйте $text вместо $file

  • -quiet - не выводит команды перед выполнением

  • -relnames - удаляет имена корневых каталогов из имен файлов

  • -i[files] - обработать список текстов или имен файлов из stdin

  • -idirs - обработать список имен каталогов из стандартного ввода.
    В стандартном вводе строки примечаний '#' и пустые строки пропускаются. Примечание:
    «sfk.exe list.txt» поддерживает только 4 КБ для файла list.txt под Windows.
    «type list.txt | sfk.exe» поддерживает неограниченную длину потока.

  • -nofile[names] - с цепочкой, не создает записи имен ":file"

  • -printcmd - вывести полную команду, которая выполняется, в консоль

  • -stoprc=n - остановить обработку, если команда возвращает код возврата >= n.

    Формат командной строки

    С опцией -SPAT поддерживаются шаблоны косой черты, такие как \t \q \xnn. Из-за синтаксических ограничений командной оболочки это может помочь.

    - использовать \q вместо \" (позволяет избежать неправильного подсчета кавычек в оболочке)

    - использовать \x26 вместо & (если амперсанд ведет себя неожиданно)


    Расширение закавыченных переменных

    При использовании переменных sfk, содержащих имена файлов, например run "copy #(src) #(dst)", пробелы в именах файлов требуют заключения в кавычки.

    Использование -spat и \q может вызвать конфликты, если само имя файла содержит известные шаблоны косой черты, например \t в файле «mydir\thebar.txt».

    Чтобы избежать этого, вы можете использовать (только при запуске sfk): run "copy #(src) #(dst)",
    который будет заключать содержимое переменной в двойные кавычки.

    Многострочные параметры в кавычках поддерживаются в сценариях с использованием обрезки параметров.


    Временные или постоянные выходные файлы

    Если выходные данные запуска подвергаются постобработке с помощью цепочки команд, например run ... +filter, sfk создает временные файлы для сбора вывода. По умолчанию эти файлы удаляются после завершения выполнения.

    Укажите -to targetdir\$file, чтобы записать выходные данные команды в постоянный целевой набор файлов. Необходимые каталоги создаются автоматически.

    -to принимает ту же маску, что и сам запуск, например, -в "mydir\$path\$base.tmp" по умолчанию стандартный вывод и стандартный поток ошибок записываются в файл.

    Добавьте 2>nul к вашей команде, чтобы удалить поток ошибок.

    Коды возврата для переменных

    Переменная sfk run.lastrc содержит код возврата вызванной внешней программы. Если было обработано несколько файлов, он содержит только код возврата последнего файла.

    Примечания по цепочке команд sfk run "...$path..." +nextcmd: будет передавать каталоги, а не имена файлов.
    sfk run ... -to tmp\$file +nextcmd: будет передавать имена выходных файлов, а не входные.
    sfk run ... +run: передаст неизмененный список входных имен файлов.

    СМОТРИТЕ ТАКЖЕ

    sfk perline Выполнить команду (команды) SFK для каждой строки ввода текста

    sfk runloop Выполнить команды с помощью счетчика циклов

    ПРИМЕРЫ

    sfk run "attrib -R $qfile" -quiet testfiles\FooBank\BarDriver удаляет атрибут readonly для всех файлов в BarDriver

    sfk run "<img src=$quottext>" -dir . -file .jpg -nohead >index.html Создайте список изображений в стиле HTML из всех файлов JPEG (используя только симуляцию).
    Обратите внимание, что опция -nohead удаляет строки информационного текста [simulating:]

    type dirlist.txt | sfk run -idirs "xcopy \"x:\$path\" \"z:\$path\" /I /D" update-скопировать все каталоги из dirlist.txt от x: до z:

    sfk run "diff oldsrc\$file newsrc\$file" -relnames -sincediff oldsrc newsrc Сравнивайте каталоги, запускайте "diff" для всех файлов с разным содержимым

    sfk run "diff $qsince $qfile" -sincediff oldsrc newsrc То же, что и выше, только короче и безопаснее (включая кавычки вокруг имен файлов).

    sfk run "zip update.zip $qfile" -since 20070131 . .java .jsp собрать файлы .java и .jsp, добавленные/измененные с 31 января 2007 г., в zip-файл

    sfk list testfiles .txt +run vi Откройте все файлы .txt в VI. $qfile добавляется автоматически.

    sfk sel . .avi +run "ffmpeg -i $file -f image -t .02 thumbs\$base-%d.jpg" Извлеките первое изображение из всех фильмов и видео .avi с помощью ffmpeg.

    sfk sel -since 30m . .cpp .hpp +run -printcmd "rm $path/$base.o" удалить все объектные файлы исходных кодов, измененных за последние 30 минут

    sfk echo -lines 100 101 102 +run "showstatus.bat $text" Запустите showStatus.bat три раза с указанными номерами, например, локальными IP-адресами

    sfk sel soundlib .wav -tomake "outdir\$base.mp3"

    +run "ffmpeg -i $qfile $qtarg" для всех файлов .wav в Soundlib, у которых нет или есть более старый файл .mp3 в outdir, выполните команду ffmpeg для преобразования из .wav в .mp3.

    sfk -exectime run. "copy in.dat out.dat" Измерьте время, необходимое для выполнения команды копирования

    sfk -var run "myprog.exe" -yes +tell "myprog rc: #(run.lastrc)"

    Запустите внешнюю программу MyProg.exe и сообщите ей код возврата.
    Не пытайтесь выполнить полный оператор run за ONE GO. Почти наверняка что-то пойдет не так (выбраны неправильные файлы, синтаксическая ошибка в самой команде). В итоге получается много неправильных выходных файлов.
    Вместо этого используйте ТРИ ШАГА:

  • 1. Путем проб и ошибок найдите правильный набор файлов:

    sfk run "echo $quotfile" mydir

    Это просто покажет все имена файлов из «mydir». Для этих файлов не выполняется никакая команда, поэтому ничего плохого не происходит. Почти наверняка вы заметите, что включено слишком много файлов. Возможно, вам придется добавить «-nosub», чтобы исключить подпапки, или добавить дополнительную информацию о выборе файла, например:

    sfk run "echo $quotfile" mydir .jpg .jpeg что уменьшает выбор файлов до файлов .jpg и .jpeg в «mydir».

  • 2. Замените "echo" фактической командой, все еще работающей в режиме моделирования.

    sfk run "copy $quotfile \"d:\pic\small_$base.jpg\"" mydir .jpg .jpeg

    Это имитирует копию всех изображений из mydir в d:\pic, добавляя к их имени префикс «small_» и гарантируя, что все расширения целевых файлов будут только «.jpg».

  • 3. Когда вы будете удовлетворены результатом моделирования, добавьте "-yes"

    Пример:
    Перечислите методы всех файлов .class в дереве каталогов.

    На этот раз мы воспользуемся другим подходом и начнем с "sfk list"
    Чтобы перечислить все файлы .class в дереве каталогов «pack», мы говорим:

    sfk list pack .class

    Это может привести к следующему результату:

     pack\Lemon.class
     pack\Curry.class
     pack\Yet.class
     pack\Another.class
     pack\One.class
    

    Наша цель состоит в том, чтобы превратить эти строки в команды вида:

    javap pack.classname

    Как же этого достичь ?

  • Во-первых, нам нужно изменить формат выходных строк, добавив команду filter :

    sfk list pack .class +filter -rep /\/./ -rep /.class//

    При этом все косые черты "\" заменяются точкой ".", а ".class" удаляется.
    Теперь результирующий результат:

       pack.Lemon
       pack.Curry
       pack.Yet
       pack.Another
       pack.One
    

  • Теперь мы передаем это в "run":

    sfk list pack .class +filt -rep /\/./ -rep /.class// +run "javap $file"

    Результирующий результат - смоделированный предварительный просмотр - теперь выглядит следующим образом:

       javap "pack.Lemon"
       javap "pack.Curry"
       javap "pack.Yet"
       javap "pack.Another"
       javap "pack.One"
    

  • Наконец, выполните команду еще раз, на этот раз добавив "-yes":

    sfk list pack .class +filt -rep /\/./ -rep /.class// +run "javap $file" -yes
    Это приведет к перечислению интерфейсов всех классов.