Я новичок в этом деле, поэтому я надеюсь, что кто-то поможет.

Я делаю это на 32-битной версии Windows Vista.

У меня есть 2 папки на рабочем столе: folder_a (с sed.exe) и folder_b с этими файлами:

  • sand.txt
  • tree.txt
  • chair.txt
  • хуг-fork.txt
  • хуг-spoon.txt

Если я запускаю командный файл с этой строкой:

call "C:\Users\X\Desktop\folder_a\sed.exe" -i "1c table-zeta" "C:\Users\X\Desktop\folder_b\*xyz*.txt

Я могу изменить первую строку тех файлов, имя файла которых содержит xyz.

Теперь я хочу изменить первую строку тех файлов, чье имя файла НЕ содержит xyz; в этом случае только sand.txt, tree.txt и chair.txt.

Как бы я это сделал?

1 ответ1

0

Это может быть немного не элегантно, но поместите это в свой пакетный файл:

setlocal enabledelayedexpansion
        ︙
for %%f in (*) do (
    set tempname=%%f
    set tempname=!tempname:xyz=!
    if %%f == !tempname! (put your sed command here) %%f
)

Команда setlocal может быть в начале пакетного файла или прямо перед циклом for или где-то между ними.  (Я рекомендую поместить его в начало командного файла, сразу после @echo off .)  Запустите cmd /? и setlocal /? немного больше информации об этой команде.  По сути, это позволяет вам обрабатывать переменные в циклах несколько вменяемым образом.

Я предполагаю, что вы достаточно знаете о пакетных файлах, что вы понимаете, что FOR variable IN (set) DO command циклически перебирает имена файлов в set (который может включать в себя подстановочные знаки, такие как *), устанавливая variable для каждого имени файла и выполняя command.  Скобки (после do и в конце) позволяют нам иметь многострочную command.  Синтаксис обычной переменной не работает с %%variable s, поэтому мы копируем %%f во временную переменную.  Затем мы используем форму расширения %variable:str1=str2% (find and replace), чтобы заменить все вхождения xyz в %tempname% .

            ... За исключением того, что мы находимся в цикле, мы должны использовать ! вместо % (это то место, куда входит setlocal enabledelayedexpansion).  Затем мы сравниваем сокращенное имя файла с исходным именем (все еще в %%f).  Если они равны, то в имени файла не должно быть ни одного экземпляра xyz , поэтому мы запускаем вашу команду.  Если они разные, это означает, что подстановка нашла хотя бы один xyz , поэтому мы не запускаем вашу команду.

PS Я считаю, что вам не нужна команда call .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .