Я только что понял, что запускаю bat-файл в начале этого раздела реестра, в котором есть echo running abc и некоторые другие не относящиеся к делу вещи

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

Итак, здесь я изменил этот файл bat ... это всего лишь одна строка, ничего не значащего в нем.

Вы видите содержимое файла bat.

Вот некоторые результаты из командной строки cmd, показывающие ситуацию, которая является той же фундаментальной проблемой, но вы должны быть в состоянии воспроизвести проблему

Вопрос сейчас в том,

  • Почему он говорит эхо sss, а не эхо тсс ттт?
  • Как я могу подавить запуск cmd или файла инициализации bat с помощью FOR? Оператор FOR должен действительно отображать "echo g", а не "echo sss" или "echo sss ttt".

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\

C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt   

C:\>  

C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>

C:\>echo sss
sss

C:\>echo g
g

C:\>

3 ответа3

1

Почему он говорит эхо sss, а не эхо тсс ттт?

Потому что строка sss ttt содержит символ пробела. Команда for токенизирует его и сохраняет первую половину sss в %f и вторую половину ttt в переменной %g .

Как я могу подавить запуск cmd или файла инициализации bat с помощью FOR? Оператор FOR должен действительно отображать "echo g", а не "echo sss" или "echo sss ttt".

Похоже, для того, чтобы оценить echo g ^| findstr "g" инициализируется новый интерпретатор команд, и ваш \blah\startfile.bat автоматически выполняется. Сделайте свою партию, чтобы ничего не выводить.

0

Просто чтобы немного расширить ответ Властимила ...

Когда команда FOR выполняет "echo g" и направляет вывод в findstr, FOR должна сначала запустить новый командный процессор, который вызывает выполнение \blah\startfile.bat .

\blah\startfile.bat выводит строку, содержащую sss ttt. Эта строка обрабатывается FOR и НЕ передается в findstr.

Согласовывающ помощь для FOR:

Обработка состоит из ..., разбивая его на отдельные строки текста, а затем разбирая каждую строку в ноль или более токенов. Тело цикла for затем вызывается со значением (ями) переменной, установленными на найденную строку (и) токена. По умолчанию /F передает первый пустой токен из каждой строки ...

Разделителями по умолчанию для FOR являются: ",;" (пробел и точка с запятой).

Первая строка, которую обрабатывает FOR, содержит строку: sss ttt. Эта строка содержит " " (пробел), который является разделителем по умолчанию для FOR, который анализирует строку и назначает первую строку токена: "sss" для "% f". Таким образом, «echo% f» выводит строку только: "sss". Это первая строка, которую вы видите напечатанной. "Ttt" просто отбрасывается, потому что в команде «FOR ... echo% f» не было указано ничего, кроме первого токена.

Если бы команда FOR была написана по-другому, вы бы увидели полную строку "sss ttt" .

Вот три способа, которыми команда FOR могла быть написана для этого.

Первый способ, используя опцию "delims=" , устанавливает разделитель FOR для "empty", поэтому FOR возвращает всю строку как 1 токен. Токены по-прежнему анализируются, и все разделители (",;") удаляются, затем все токены снова объединяются с пробелом между каждым токеном. Это объединенное значение возвращается в переменной "% f"

C:\>for /f "delims=" %f in ('echo sss ttt')  do echo %f

C:\>echo sss ttt
sss ttt

C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f

C:\>echo mm nn oo ss tt
mm nn oo ss tt

Этот следующий способ, используя опцию "tokens=*" , говорит FOR помещать все найденные токены в значение указанной переменной ("% f"). Токены все еще анализируются, и все разделители удаляются, затем все токены снова объединяются с пробелом между каждым токеном.

C:\>for /f "tokens=*" %f in ('echo sss ttt')  do echo %f

C:\>echo sss ttt
sss ttt

C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f

C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt

Этот третий способ, используя опцию "tokens=1,*" , указывает FOR помещать первый (1) найденный токен в значение указанной переменной («% f»). И, оставшиеся токены анализируются, и все разделители удаляются, затем все эти оставшиеся токены снова объединяются с пробелом между каждым токеном, и это объединенное значение возвращается в переменной, названной буквой, следующей за указанным именем переменной (так в этом случае переменная "% g").

C:\>for /f "tokens=1,*" %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss ttt
sss ttt

C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"

C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"

Обратите внимание, что следующее не будет работать, потому что нет никаких «tokens =», определенных для переменных, кроме указанной переменной «% f»:

C:\>for /f %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss %g
sss %g


Итак, в вашем примере, если вы добавите опцию "delims=" , вы увидите это:

C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f

C:\>echo sss ttt
sss ttt

C:\>echo g
g

C:\>
0

Если вы собираетесь использовать %f в пакетном файле, вам нужно экранировать его с другим %:

for /f %%f in ('echo g ^| findstr "g"') do echo %%f

Поместите это в свой пакетный файл, и вы должны получить результаты, которые вы ищете.

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