Переименуйте файлы "Синтаксис команды неверен" .bat - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь удалить строку из нескольких имен файлов в нескольких каталогах.Это файл, как и несколько создаваемых файлов, так что я могу проверить, какие значения на самом деле являются SET.

Когда я добираюсь до rename в самом низу, я получаю ошибку:

Синтаксис команды неправильный.

Я не вижу ничего плохого в создаваемых текстовых файлах _intf и _fnlf.Есть ли хитрость в использовании переменных в качестве пути к файлу при переименовании?

@ECHO off

echo Delete dir.txt?
PAUSE

del dir.txt
del item.txt
del file.txt

::paths for all directories in root (where filerename.bat is run)
 ::get root dir path
 SET "_c=%CD%"
 SET /A "counter=0"
 ::get dir list and concats root dir path before
 FOR /F "tokens=*" %%A in ('DIR /on /b /a:d /p %svnLOCAL%') DO ( 
    SET "_dirp=%_c%\%%A"
    CALL :sub1
    SET /A "_counter+=1"
 )

::finds each file in dir
:sub1
 ::make file to check dir path
 ECHO "%_dirp%" > dir.txt
 FOR /F "tokens=*" %%B in ('DIR /b %_dirp%') DO (
  ECHO "%%B" > item.txt
  SET "_item=%%B"
  SET "_filep=%_dirp%\"
  CALL :sub2 %%~nB
PAUSE
 )
 ECHO "%_counter%"
EXIT /b 0

::builds file paths
:sub2
 set "str=%*"
 set "str=%str:[1]=%"
 SET "_intf=%_filep%%_item%"
 SET "_fnlf=%_filep%%str%"
 CALL :sub3
EXIT /b 0

::Renames each file
:sub3
 ECHO "%_intf%" > _intf.txt
 ECHO "%_fnlf%" > _fnlf.txt
 ren "%_intf%" "%_fnlf%.jpg"
EXIT /b 0

1 Ответ

2 голосов
/ 09 марта 2019

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

Это можно заметить, введя Ren /? в командной строке, который показывает синтаксис:

REN [drive:][path]filename1 filename2

Однако вы, похоже, используете:

REN [drive:][path]filename1 [drive:][path]filename2

…, что приведет к ошибке:

Синтаксис команды неверен.

В качестве простого исправления для вашего сценария вам нужно изменить следующую строку:

set "str=%str:[1]=%"

на:

set "_fnlf=%str:[1]=%"

Затем удалите строку:

SET "_fnlf=%_filep%%str%"

Если вы хотите привести в порядок код, вы можете изменить его на:

@Echo Off
Set "i=0"
For /F "Delims=" %%A In ('Dir /B/AD "%svnLOCAL%" 2^>Nul') Do (
    Set /A i+=1
    For /F "Delims=" %%B In ('Dir /B/A-D "%~dp0%%A\*[1]*" 2^>Nul') Do (
        Set "$=%%~nB"
        Call Ren "%~dp0%%A\%%B" "%%$:[1]=%%.jpg"
    )
)
Echo "%i%"
Pause

или использовать DelayedExpansion:

@Echo Off
Set "i=0"
For /F "Delims=" %%A In ('Dir /B/AD "%svnLOCAL%" 2^>Nul') Do (
    Set /A i+=1
    For /F "Delims=" %%B In ('Dir /B/A-D "%~dp0%%A\*[1]*" 2^>Nul') Do (
        Set "$=%%~nB"
        SetLocal EnableDelayedExpansion
        Ren "%~dp0%%A\%%B" "!$:[1]=!.jpg"
        EndLocal
    )
)
Echo "%i%"
Pause

Вдва примера выше, я взял ваш комментарий, where filerename.bat is run, чтобы обозначить каталог, в котором находится этот скрипт, filerename.bat.Если вы имели в виду текущий рабочий каталог, , который не обязательно совпадает с , вы должны заменить экземпляры %~dp0 выше на %__CD__%.

Кроме того, как неИсходя из предоставленной вами информации , я предположил, что %svnLOCAL% уже определено.

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