2016-12-21 4 views
3

У меня есть пакетный файл, который я пытаюсь получить, и у меня возникают проблемы с подавлением вывода нескольких команд. Одно из моих решений - запустить команды с символом @ - (что-то, что я сделал достаточно много раз). Вот код:Ошибка командного файла `@`

@echo off 
setlocal 
for /f "tokens=*" %%i in (tmp\hdata.txt) do (

    ::' just a note - hdata.txt contains lines of text such as, 
    ::' for example: 
    ::' jquery_javascript_32 
    ::' underscore_javascript_9 
    ::' I couldn't do this with simple delimiters because some lines are like: 
    ::' underscore_js_javascript_43 

    set "id=%%i" 
    set filewithnum=!id:_javascript_=! 

    ::' *** BELOW throws error *** 
    @echo !filewithnum!|findstr /R "[0-9]$" && set "file=!filewithnum:~,-1!" >nul 2>&1 

    ::' *** BELOW throws error *** 
    @echo !filewithnum!|findstr /R "[0-9]$" && set "file=!file:~,-1!" >nul 2>&1 

    echo !file! 

) 

endlocal 
exit /b  

линии комментировал выше броска: '@echo' is not recognized as an internal or external command, operable program or batch file.

Кажется странным.

Любые идеи относительно того, что здесь происходит?


Примечание: Дополнительный ' после комментария :: выше, чтобы сделать подсветку синтаксиса работать должным образом на StackOverflow.

+3

две очевидные проблемы в том, что вы использовали 'setlocal', но не' SETLOCAL enabledelayedexpansion', поэтому '' вар синтаксис не будет работать!. Во-вторых, '::' является сломанной меткой, а метки не разрешены в блоке - замените на 'rem' – Magoo

+0

@Magoo. В реестре включена функция enablededayeexpansion, поэтому мне это не нужно. Это хорошо знать о '::'. Я этого не знал; но в этом случае это не проблема, так как комментарии были добавлены только в 'Stackoverflow' и не включены в исходный файл. – user1167442

+1

[** Никогда ** использовать ': label' или' :: label-like comment' внутри командного блока, заключенного в '()' круглые скобки] (http://stackoverflow.com/a/32147995/3439404) – JosefZ

ответ

3

Как только вы исправили точки Magoo, поднятые в комментариях, вам необходимо подавить вывод findstr. Вам не нужно @, так как режим эхо-команды уже отключен в начале скрипта.

Вы получили это:

@echo !filewithnum!|findstr /R "[0-9]$" && set "file=!filewithnum:~,-1!" >nul 2>&1 

Таким образом, вы перенаправлять вывод команды set! Для того, чтобы перенаправить вывод findstr, сделайте следующее:

echo !filewithnum!|findstr /R "[0-9]$" >nul 2>&1 && set "file=!filewithnum:~,-1!" 
+0

Это отвечает на вопрос, на который я действительно хотел ответить, поэтому спасибо. Я приму это как ответ, если вы можете мне это сказать: Является ли двойной синтаксис '@' тем, что вызывает ошибку? Вы наверняка получаете надпись, но я хочу знать, почему эта ошибка возникает. – user1167442

+2

@ user1167442 Я думаю, причина, по которой вы получаете эту конкретную ошибку, является одной из тех недокументированных загадок cmd.exe, но вы обнаружите, что если вы замените комментарии '' '' '' '' '' '' '' '' '' ', ваша проблема исчезнет. '::' никогда не предназначалось для использования в качестве комментария, поэтому, если вы используете недокументированную функцию, любое поведение разрешено. –

+5

Вы можете использовать '::' как комментарий, даже внутри командных блоков, НО вы должны точно знать поведение [В круглых скобках «ориентированы две строки» (http://stackoverflow.com/a/4006006/463115). Вторичная строка после ': label' не будет распознавать' @ 'как специальный символ, вместо этого она пытается выполнить файл с именем' @ echo.bat' – jeb

Смежные вопросы