Почему мы не можем использовать команду CALL: label в скрипте FORFILES? - PullRequest
2 голосов
/ 03 февраля 2020

Этот фрагмент кода

forfiles /P %pathname% /M *.log /c "cmd /c echo @file"

с радостью выведет список файлов.

Мы могли бы заменить ECHO на RENAME или MOVE или многие другие комбинации внутренних команд: исключение составляет CALL для имени метки.

Например, заменив ECHO выше следующим образом:

forfiles /P %pathname% /M *.log /c "cmd /c CALL :listit @file"
 : :
 : :
exit /b

:listit
echo %1
exit /b

Что, как я надеялся, будет иметь тот же вывод дает сообщение об ошибке, обычно

Invalid attempt to call batch label outside of batch script.

Это поведение не является чем-то, о чем говорится в документации Microsoft, и, поскольку альтернативы вполне адекватны, я не пытался заставить его работать.

Но меня интересует Ну, почему бы и нет?! , и поэтому я задаю вопрос

Почему мы не можем использовать команду CALL: label в скрипте FORFILES?

Спасибо.

1 Ответ

4 голосов
/ 03 февраля 2020

Как уже заметил @Stephan, он не может использовать метки, потому что он выполняется в контексте командной строки.

В большинстве случаев вы можете использовать более простую команду FOR.

Но в случаях, когда вам нужны forfiles и метки, это можно решить с помощью простого трюка.

  1. В начале вашего командного файла вам нужна строка FOR /F ... goto :%%L.
  2. И при вызове метки она должна быть заключена forfiles ... call %~d0\:<myLabel>:\..\%~pn0
@echo off
FOR /F "tokens=3 delims=:" %%L in ("%~0") DO goto :%%L

...
forfiles /P %pathname% /M *.log /c "cmd /c CALL %~d0\:listit:\..\%~pn0 @file"
...

:listit
echo %1
exit /b

Хороший совет от aschipfl:
Чтобы добавить немного стабильности (против пробелов в путь / имя файла) вы можете заключить назначение вызова в кавычки call 0x22%~d0\:listit:\..\%~pn00x22 @file.

Это специальный синтаксис только в forfiles, где 0xHH - шестнадцатеричный код для символа 0x22=".

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