Циклы и «существует» в пакетных файлах - PullRequest
3 голосов
/ 25 февраля 2012

Мне трудно понять следующий пакетный скрипт:

@echo off
echo b>b.txt
for /f %%A in ('echo b.txt b.txt') do (
    echo %%A
    if not exist %%A (
        echo does not exist.
    ) else (
        echo %%A exist.
    )
)

Вначале я проверяю, существует ли файл "b.txt", и затем я ожидаю, что цикл будет выводиться дваждыимя этого файла, и что он существует.Тем не менее, фактический результат, который я получаю:

b.txt
does not exists

Может кто-нибудь объяснить это поведение?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

Так же, как совет, вы можете попытаться присвоить имя файла переменной, просто чтобы убедиться, что вы ссылаетесь на одну и ту же вещь в обоих выражениях, например:

set file=b.txt
echo b>%file%
for /f %%A in ('echo %file% ^& echo %file%') do (
    echo [%%A]
    if  not exist %%A (
        echo [%%A] does not exist.
    ) else (
        echo [%%A] exist.
    )
)

Я также убрал echo off, чтобы вы увидели расширениевывод и поместите квадратные скобки вокруг %%A, чтобы увидеть его границы

Редактировать: дополнительное устранение неполадок:
Возможно, я бы начал собирать скрипт из командной строки, меняя только только одну вещь ввремя и посмотрим, где оно сломается.

if b.txt exist echo Exists

Если это работает, то

for /f %A in ('echo whatever') if b.txt exist echo Exists

и т. Д., До

for /f %A in ('echo b.txt ^&echo b.txt') do (if exist %A (echo %A exists) else (echo not exists))

YouМожно также использовать разные для варианта (хотя я не понимаю, как это может иметь значение):

for %A in (b.txt b.txt) do (if exist %A (echo %A Exists) else (echo not exists))

1 голос
/ 07 января 2013

Старый пост я знаю и по какой-то причине проблема была вызвана Ансиконом? Я получаю тот же результат, что вы впервые опубликовали без этой программы, и правильное объяснение, если вы хотите, чтобы оно повторяло все слова, заключается в том, что вам нужно указать токены, так как каждое повторяемое слово будет одним токеном и без указания количества токенов будет отображаться только первый токен. Добавьте это "tokens = *" в оператор FOR / F, как показано ниже.

@echo off
echo b>b.txt
for /f "tokens=*" %%A in ('echo b.txt b.txt') do (
    echo %%A
    if not exist %%A (
        echo does not exist.
    ) else (
        echo %%A exist.
    )
)

Это будет производить это:

echo b.txt b.txt
does not exist.

Таким образом, он никогда не найдет файл с именем "b.txt b.txt", поскольку именно так будет переведен %% A. Но если цель состояла в том, чтобы повторить все слова после эха и проверить наличие b.txt, тогда это сработает

@echo off
echo b>b.txt
for /f "tokens=*" %%A in ('echo b.txt b.txt') do (
    echo %%A %%B
    if not exist %%A (
        echo does not exist.
    ) else (
        echo %%A exist.
    )
)

Вывод, который я получаю сверху:

b.txt b.txt
b.txt exist.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...