Arhn - архитектура программирования

Как указать /D в команде FOR?

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

FOR /F %%i IN ('DIR .') DO echo %i # Outputs each file name

Команда (DIR .) выполняется в дочерней командной строке через cmd /C <command> <command-arguments>, однако параметр /D не указан... это приводит к странному поведению, если у пользователя есть команда автозапуска с выводом (например, echo или cls).

Есть ли способ заставить FOR выполнить команду через cmd /C /D <command> <command-arguments>?

14.03.2016

  • Очень простой обходной путь — использовать промежуточный файл вместо команды: DIR . > DIR.txt & FOR /F %%i IN (DIR.txt) DO echo %%i 14.03.2016

Ответы:


1

Очень простое решение вашей проблемы — использовать файл в команде for /F вместо команды. Таким образом, мы просто эмулируем внутреннюю операцию for /F над командой, но выполняем каждый шаг явно: 1. Выполняем команду и сохраняем результат во временном текстовом файле. 2. Обработать все строки во временном файле. 3. Удалите файл.

DIR . > TempFile.txt
FOR /F %%i IN (TempFile.txt) DO echo %%i
DEL TempFile.txt
15.03.2016
  • Отличная идея, и простая в реализации. 15.03.2016

  • 2

    Вы столкнулись с одним из многих недостатков конструкции cmd.exe, и этот недостаток беспокоил меня в течение достаточно долгого времени. Я почти уверен, что нет способа подавить автозапуск, когда FOR /F выполняет команду.

    Что особенно раздражает, так это то, что каналы также используют CMD /C (по одному для каждой стороны канала), но разработчики канала были достаточно умны, чтобы включить параметры /D и /S. Очень жаль, что дизайнеры FOR/F не смогли сделать то же самое.

    Я полагаю, что ваш единственный выход Один из вариантов — защищаться в определении команды автозапуска. Я предлагаю поместить все команды автозапуска в пакетный скрипт, который имеет что-то вроде следующего вверху:

    @echo off
    if defined AutoRunComplete exit /b
    set AutoRunComplete=1
    REM Put your AutoRun commands below...
    

    Но если вы не можете управлять командами автозапуска, то я думаю, вам не повезло. идея Аачини об использовании временный файл, чтобы обойти проблему, является эффективным и простым решением.

    14.03.2016
  • Спасибо за ваш комментарий - к сожалению, я не могу контролировать файл автозапуска, проблема возникла на сайте клиента, и мы хотели убедиться, что мы не можем снова столкнуться с такой же ситуацией в будущем. Знаете ли вы случайно, что в какой-либо проблеме MS Connect обсуждается эта проблема? 14.03.2016
  • @Д.Р. - Лучшее, что я смог найти, находится на blogs.msdn.microsoft.com. /oldnewthing/20071121-00/?p=24433 14.03.2016

  • 3

    Если у вас много блоков FOR/F для разбора выходных данных программы, может быть полезно добавить оболочку cmd.exe.

    Эту оболочку можно установить с помощью

    set "comspec=C:\somewhere\cmdWrapper.exe"
    FOR /F %%i IN ('DIR .') DO echo %%i
    

    Сама оболочка должна запускать исходный cmd.exe с /D /C.

    Но поведение самой переменной comspec немного странное.

    15.03.2016
  • Еще одна интересная идея. Я полагаю, вы могли бы реализовать оболочку с помощью CSCRIPT. Но странное поведение, когда cmd FOR /F кэширует значение COMSPEC, делает этот метод ненадежным. Я не понимаю, как вы можете контролировать, является ли ваш сценарий первым запуском, который использует FOR /F. 16.03.2016
  • Я уже пробовал CSRIPT, но он терпит неудачу, так как не принимает параметр /C. В настоящее время я играю с файлами .hta для mshta, но не могу заставить его работать, так как кажется, что для comspec действительны только файлы .exe, но не ассоциации файлов. 16.03.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..