2014-02-05 3 views
0

Я пишу командный файл, в котором я могу переименовать имя файла xml внутри папки на моем рабочем столе.пакетный скрипт, переименование xml-файла внутри папки

  • приглашения пользователя ввести имя файла
  • , если имя файла будет найдено, он будет запрашивать у пользователя на ключ в существующем имени файла XML
  • если имя существующего XML-файл, он затем предложит пользователю ввести новое имя файла xml

обзор моего содержимого внутри имени файла (bb).

file

это моя партия-скрипт

@echo off 
set /p fn=Enter Folder name: 
if exist C:\Users\roberts\Desktop\%fn% (
    set /p oldxmlname=Enter a old xml file name: 
    if exist C:\Users\roberts\Desktop\%fn%\%oldxmlname%.xml (
     set /p newxmlname=Enter a new xml file name: 
     ren C:\Users\roberts\Desktop\%oldxmlname%.xml %newxmlname%.xml 
     echo file name changed successfully. 
    ) 
)else (
    echo folder not found in path. 
    echo C:\Users\roberts\Desktop\%fn% 
) 

это мой выход. Имя файла не изменилось вообще.

output

ответ

3

Внутри оператора блока (a parenthesised series of statements), блок весь разбирается и затем казнены. Любой %var% внутри блока будет заменен значением этой переменной во время разбора блока - до того, как будет выполнен блок.

Следовательно, IF (something) else (somethingelse) будет выполнен с использованием значений %variables% в момент возникновения ошибки IF. Тот же комментарий для REN.

Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion и использовать !var! вместо %var%, чтобы получить доступ к измененному значению var или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.

И если используется ELSE условие, то IF -True команда должна быть(parenthesised) и ) и ELSEдолжны быть на одной и той же физической линии. Если ELSE -true команда (parenthesised), ELSE и (должно быть быть на одной и той же физической линии. Там must be a Пространство с обеих сторон ключевого слова else.


Демонстрация:

@echo off 
SETLOCAL 
cls 
set var=ORIGINAL 
echo Start value of var=%var% 
for %%i in (1) do (SET var=AFTER 
ECHO var is %var% in the for loop 
) 
echo Final value of var=%var% 
ENDLOCAL 
ECHO. 
echo ---- try again with ENABLEDELAYEDEXPANSION 
ECHO. 
setlocal enabledelayedexpansion 
set var=ORIGINAL 
echo Start value of var=%var% 
for %%i in (1) do (SET var=AFTER 
ECHO var is %var% not !var! in the for loop 
ECHO Note: in the loop VAR has old value %var% and new value !var! 
) 
echo Final value of var=%var% 
endlocal 

Обратите внимание, как значение var интерпретируется по-разному в зависимости от использования setlocal или setlocal enabledelayedexpansion. Синтаксис !var! доступен только в режиме delayedexpansion и получает доступ к значению var при его изменении в блоке,

+0

извините, что я действительно не понимаю, что вы имеете в виду. потому что это мой первый раз, когда я пишу пакетный файл. Но я заметил что-то, в первый раз редактирую свое имя файла, например (от b до z), имя файла не изменяется. теперь, если я нахожу b, имя файла не найдено. теперь я должен снова набрать z (от z до b), тогда он изменит имя файла с b на z – user2935569

1

Вы оставили \%fn% из команды ren, так что файл, который вы просили переименовать действительно не существует.

ren C:\Users\roberts\Desktop\%fn%\%oldxmlname%.xml %newxmlname%.xml Вы хотите

+0

спасибо. Я заметил что-то, в первый раз отредактировал мое имя файла, например (от b до z), имя файла не изменяется. теперь, если я нахожу b, имя файла не найдено. теперь я должен снова набрать z (от z до b), тогда он изменит имя файла с b на z – user2935569

1

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

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

@echo off 
set /p fn=Enter Folder name: 
if not exist "C:\Users\roberts\Desktop\%fn%\" (
    echo The engines canna take the strain captain, try again! 
    goto :EOF 
) 

    set /p oldxmlname=Enter a old xml file name: 
    if not exist "C:\Users\roberts\Desktop\%fn%\%oldxmlname%.xml" (
    echo folder not found in path. 
    echo "C:\Users\roberts\Desktop\%fn%" 
    goto :EOF 
    ) 

     set /p newxmlname=Enter a new xml file name: 
     ren "C:\Users\roberts\Desktop\%oldxmlname%.xml" "%newxmlname%.xml" 
      if not errorlevel 1 (
        echo file name changed successfully. 
      ) else (
        echo oops! Something is fubar 
      ) 
+0

спасибо за вашу помощь – user2935569

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