Пакетный скрипт Windows «Системе не удается найти указанный файл».с восклицательным знаком в именах файлов? - PullRequest
0 голосов
/ 03 марта 2019

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

Когда папка перетаскивается в пакетный скрипт, она обрабатывает каждый файл в этой папке.

Я сталкиваюсь с проблемой с определенными именами файлов, которые содержат восклицательные знаки.Например:

!.txt или !!!.txt

Сейчас я просто пытаюсь переименовать файл, чтобы продемонстрировать проблему:

@echo off

SetLocal EnableDelayedExpansion
set folder=%~1
set count=0

for /r "%folder%" %%G in (*) do (
    set fullpath=%%G
    set fileExtension=%%~xG
    call :processFile
)
goto end

:processFile
    echo "fullpath = %fullpath%"
    echo "fileExtension = %fileExtension%"

    rename "%fullpath%" "temporary_filename_500%fileExtension%"

    set /a count+=1
echo.
    goto :eof

:end

echo "%count% files processed."

pause

Это дает мнеошибка "Система не может найти указанный файл."Тем не менее, это работает, если я изменю имя файла на что-то простое, например «test.webm». Как я могу сделать скрипт более устойчивым?

1 Ответ

0 голосов
/ 03 марта 2019

Я не вижу, чтобы вы использовали расширение с задержкой.Итак, либо отключите его с помощью setlocal DisableDelayedExpansion в начале вашего командного файла, либо просто удалите его, удалив строку setlocal EnableDelayedExpansion.

Однако, если вы хотите сохранить его, выполните:

@echo off

SetLocal EnableDelayedExpansion

rem Code above (^^) if exists.

Setlocal DisableDelayedExpansion

set "folder=%~1"
set "count=0"

for /R "%folder%" %%G in (*) do (
    set "fullpath=%%~fG"
    set "fileExtension=%%~xG"
    call :processFile
)
goto end

:processFile
echo "fullpath = %fullpath%"
echo "fileExtension = %fileExtension%"

ren "%fullpath%" "temporary_filename_500%fileExtension%"

set /a "count+=1"
echo/
goto :eof

:end
echo "%count% files processed."
pause
setlocal EnableDelayedExpansion

rem Your code below with active delayed expansion:

Обратите внимание, что:

  • Вы всегда должны заключать в кавычки имя переменной и значение в команде set, например set "var=value", и set /a, например set /a "var+=1" и т. Д .;см. set /? для получения дополнительной информации.
  • Чтобы точно определить полный путь к файлу / папке в цикле for, используйте модификатор f, например %%~fG.
  • Упоминается Мофи здесь : не используйте echo.;используйте echo/ для лучшей практики.

См. также фазу 5 (отложенное расширение) этот ответ о том, как интерпретируются командные файлы.

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