Пакетный цикл FOR, выполняющий приложение с пробелами в имени пути и путь не является статическим - PullRequest
0 голосов
/ 11 декабря 2018

Для начала , это не дубликат всех вопросов об именах путей с пробелами (при выполнении команд dir в цикле for) или любых других подобных вопросов из-за одного важногоФакт: мой путь НЕ статичен и вместо этого превращается в переменную и таким образом передается в цикл.Ни один из их предыдущих вопросов не решил мою проблему, я пытался некоторое время.Мне также нужно использовать цикл FOR, я не могу поместить эту команду вне цикла FOR.Причина в том, что приложение, которое я запускаю, имеет вывод, который мне нужно проверить в пакетном режиме без внешних файлов (рабочие требования).Рабочий процесс выглядит следующим образом:

  1. Пакетные операции делают вещи
  2. Пакетные запускает сценарий C # и ждет, используя FOR loop
  3. C # сценарий делает вещи
  4. Сценарий C # возвращает с выводом, который пакет может прочитать (он печатает на консоль)
  5. Пакет * Цикл FOR, который вызывает сценарий C #, завершается, читает вывод
  6. Пакетный отчет о состоянии C #Сценарий, основанный на том, что он нашел.

Проблема заключается в использовании escape-символов внутри предложения FOR IN.Чтобы запустить внешнее приложение, где путь имеет пробелы, обычно это выглядит так:

"<path with spaces>"<application name> <other arguments>

В моем коде я делаю это (имена держатся в секрете, потому что это для работы):

"C:\my new folder"MyScript.exe | FIND "the output"

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

"%thePath%"MyScript.exe | FIND "the output"

Проблема в том, что когда я пытаюсь это сделать:

FOR /F "tokens=*" %%A IN ('"%thePath%"MyScript.exe ^| FIND "the output"') DO (REM put code here)

Это НИКОГДА не запускаеткоманда.Вместо этого я получаю ошибку: 'C:\my' is not recognized as an internal or external command, operable program or batch file. Что явно означает, что путь разделяется пробелами и интерпретируется как команда. Поэтому я попытался:

  1. добавить двойные кавычки к FOR, не сработало.Только что вернул синтаксическую ошибку.
  2. добавление двойных кавычек к переменной, когда она SET, синтаксическая ошибка.
  3. удаление кавычек, он разбил путь.
  4. поместив всю команду в одну строку и затем запустив FOR /F "tokens=*" %%A IN ('TheWholeCommandAsAString').он разделил путь.
  5. Пробовал четвертый шаг со всеми различными комбинациями цитат.он разделил путь.
  6. Я попробовал уловку, о которой я слышал на форуме, поместив "delims=" в цикл FOR.он разбил путь.
  7. Я перепробовал все варианты наличия tokens=* delims= и usebackq в моем цикле FOR, в то же время выполняя вышеуказанные тесты, ни одна из перестановок не сработала, все они разбили путь.

Очевидно, что что-то в пути, находящемся в переменной внутри цикла FOR, является проблемой здесь, потому что когда переменная раскрывается, независимо от того, какую цитату я ставлю вокруг пути, FORЦикл считает, что это несколько команд и использует первую.

Мой вопрос : какой синтаксис мне нужно использовать для этого очень специфического случая.Мне нужен путь в цикле FOR, мне нужно, чтобы путь был динамическим, я не могу использовать команду запуска, я не могу использовать вывод текстового файла, это все рабочие требования, и нет, я определенно не могу договориться ни о одном изих.Я не в состоянии сделать это.Мне просто нужно:

"%thePath%"MyScript.exe | FIND "the output"

Выполнить всю команду в цикле FOR, где я думаю, что это должно быть:

FOR /F "tokens=*" %%A IN ('"%thePath%"MyScript.exe ^| FIND "the output"') DO (REM put code here)

, но, очевидно, это не так, что такоеправильный способ сделать это?Все, что позволяет мне захватывать вывод MyScript.exe (с учетом требований), подойдет.Я не могу использовать запуск, потому что это дало бы мне вывод команды запуска (АКА ничего).

...