2013-03-11 5 views
-1

У меня есть пакетный скрипт, который перебирает файлы в каталоге и будет переименовывать файл, если он соответствует одному из четырех шаблонов. Когда я запускаю это в своей тестовой среде, он работает отлично. Однако, когда я запускаю его с гордостью, он переименовывает только первый файл, с которым он сталкивается. Я запускаю их обоих с моего компьютера против каталогов на сопоставленных дисках.Пакетный сценарий для переименования файлов, не работающих (иногда)

Я думал, что проблема может иметь отношение к одному из имен файлов, которые я ищу, содержащим знак «+», но это не создает проблемы при запуске скрипта в тесте.

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

Любая помощь очень ценится.

Мой код ниже:

@ECHO OFF 
SetLocal EnableDelayedExpansion 
REM ****************************************************************************************** 
REM 
REM   Name: get_current_foldername.bat 
REM Description: This script will rename generic loan review sample file names such as CRE.xls, 
REM    Family.xls, etc. to [docket]_[yyyymmdd]_[hhmmss]_[list type (cre, fam1-4, etc.)].xls. 
REM    Ex. 13346_20121220_125930_cre.xls. 
REM    This script is used by Globalscape as part of the completed loan review sample upload. 
REM Parameters: There is one parameter passed. 
REM    The first parameter contains the path where the source file exists. 
REM   Author: Joe Mannetta 
REM   Date: 01/28/13 
REM 
REM ****************************************************************************************** 
REM ****************************************************************************************** 
REM 
REM Set CurrPath variable to parameter value. 
REM Set CurrDirName variable to the current directory name. This excludes higher level folders. 
REM 
REM ****************************************************************************************** 
SET CurrPath=%1% 
FOR %%* in (%CurrPath%) DO (SET CurrDirName=%%~n*) 
REM ECHO Current Path is: %CurrPath% 
REM ECHO New DIR NAME is: %CurrDirName% 
REM ****************************************************************************************** 
CD %CurrPath% 
REM ECHO CurrPath is %CurrPath% 
GOTO LOOP 
REM ***************************************************************************************** 
REM LOOP Function 
REM Loops through files in directory and go to Rename function if the file name matches CRE.xls, FAMILY.xls, FAMILY5+.xls, or HELOCS.xls. 
REM ***************************************************************************************** 
:LOOP 
REM Get name of 1st file in list. Note this also returns the full file path. 
FOR /F "delims= tokens=1" %%f in ('dir /b *.xls') DO ( 
REM FOR /F "tokens=1" %%f IN ('dir /o-d /b %CurrPath%') DO ( 
    SET File=%%f 
ECHO File is: %%f 
IF %%f==CRE.xls GOTO RENAME 
IF %%f==FAMILY.xls GOTO RENAME 
IF %%f==FAMILY5+.xls GOTO RENAME 
IF %%f==HELOCS.xls GOTO RENAME 
REM ECHO %%f 
REM ECHO %ERRORLEVEL% 
GOTO END 
REM ECHO Did NOT Make it to GOTO 
) 
REM ****************************************************************************************** 
REM RENAME Function 
REM Renames the file to [folder name]_[yyyymmdd]_[hhmmss]_[CRE|FAMILY|FAMILY5+|HELOCS].xls 
REM Date is reformatted to yyyymmdd. Time is reformatted to hhmmss. Some credit due to Jimmy Selix at http://www.tech-recipes.com/rx/956/windows-batch-file-bat-to-get-current-date-in-mmddyyyy-format/ for date and time formatting. 
REM ****************************************************************************************** 
:RENAME 
REM End loop so that File variable is set to the newest file. 
    REM Drop file path to isolate the file name. 
    SET CurrFName=!File:%CurrPath%=! 
    REM ECHO CurrFName is %CurrFName% 
REM Set date to yyyymmdd format. 
SET dt=!date:~10,4!!date:~4,2!!date:~7,2! 
REM Set time to hhmmss format. Include leading zeros for single digit times. 
SET mytime=%TIME: =0% 
SET hhmmss=!mytime:~0,2!!mytime:~3,2!!mytime:~6,2! 
SET NewFName=!CurrDirName!_!dt!_!hhmmss!_!CurrFName! 
REM echo !CurrPath!\!CurrFName! !CurrPath!\!NewFName! 
REM Set new file name and rename file. 
COPY "!CurrPath!\!CurrFName!" "!CurrPath!\!NewFName!" 
COPY "!CurrPath!\!NewFName!" "!CurrPath!\..\..\archive" 
DEL /Q !CurrPath!\!CurrFName! 
REM ECHO %ERRORLEVEL% 
GOTO LOOP 
REM ******************************************************************************************* 
:END 
+0

Это много кода, чтобы вырыть через. Можете ли вы сузить его до той части, которая вызывает проблему? Есть больше шансов, что вы найдете кого-то, желающего помочь, если нам нужно будет прочитать только десяток строк кода. Правило большого пальца: если для вашего кодового блока необходима полоса прокрутки, это, вероятно, слишком много кода. –

ответ

2

Aaaaack!

Ваша основная проблема заключается в том, что вы используете GOTO внутри цикла FOR/F ... %% f.

  • УДАЛИТЬ GOTO End полностью.
  • сменяет друг GOTO RENAME к CALL :RENAME (толстой кишка значительна - она ​​указует, вызывая внутреннюю процедуру)
  • добавить GOTO :EOF заявления после окончательной близкой скобки/F ... %% ф Петли для
  • ЗАМЕНЫ GOTO LOOP в: ПЕРЕИМЕНОВАТЬ рутина с GOTO :EOF

несколько примечаний:

  • Партия не видит метку в виде n конец процедуры, например, Pascal. Он просто заряжается ... (следовательно, GOTO LOOP/REMs/:LOOP является избыточным)
  • EOF предопределен как «физический конец файла», поэтому нет необходимости в: END-метке. Достижение конечных из файла прекращает партию или вызвать ВЫЗОВ вернуть
  • SET var=%1% НЕВЕРНО (но не фатально) Форма corrrect является SET var=%1
  • %% * работает, но не является «официальной» - почему бы и нет используйте один из документированных 26 строчных и 26 строчных букв?
  • ПЕРЕИМЕНОВАТЬ плохой выбор имени для процедуры, так как команда REN является альтернативой для RENAME (т.е. это партия ключевое слово)
+0

Питер, спасибо за вашу критику. Я сделаю изменения, которые вы рекомендовали, и сообщите, как это происходит. Как вы, наверное, можете сказать, я ни в коем случае не специалист по написанию пакетных файлов. –

+0

Это не устранило проблему, но это помогло мне выяснить, что случилось. По какой-то причине список файлов не сохраняется. Скрипт проходит через список файлов, находит совпадение и переименовывает его, но затем он снова запускает команду dir цикла FOR. Поскольку переименованный файл находится в верхней части списка, он просто перебирает цикл и начинает работу. –