-1

ディレクトリ内のファイルをループ処理し、4 つのパターンのいずれかに一致する場合にファイルの名前を変更するバッチ スクリプトがあります。これをテスト環境で実行すると、完全に機能します。ただし、誇りを持って実行すると、最初に検出されたファイルの名前のみが変更されます。マップされたドライブのディレクトリに対して、PC から両方を実行します。

問題は、検索しているファイル名の 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
4

1 に答える 1

2

ああああ!

あなたの主な問題は、FOR/F...%%f ループ内で GOTO を使用していることです。

  • 完全に削除しますGOTO End
  • CHANGE EACHGOTO RENAMECALL :RENAME(コロンは重要です - 内部ルーチンの呼び出しを指定します)
  • GOTO :EOFFOR/f...%%f ループの最後の閉じ括弧の後にステートメントを追加します
  • GOTO LOOP:RENAME ルーチンのREPLACEをGOTO :EOF

いくつかのメモ:

  • バッチは、たとえば Pascal のように、ラベルを手順の終わりと見なしません。それは単に充電します...(したがって、GOTO LOOP/REMs/:LOOPは冗長です)
  • EOF は「物理的なファイルの終わり」として事前に定義されているため、:END ラベルは必要ありません。ファイルの終わりに達すると、バッチが終了するか、CALL が返されます。
  • SET var=%1%は INCORRECT (しかし致命的ではない) 正しい形式はSET var=%1
  • %%* は機能しますが、「公式」ではありません。文書化されている 26 個の小文字と 26 個の大文字のいずれかを使用しないのはなぜですか?
  • REN コマンドは RENAME の代替であるため (つまり、バッチ キーワードであるため)、RENAME はルーチンの名前としては適切ではありません。
于 2013-03-11T17:03:34.847 に答える