0

2 つのバッチ ファイルがあり、最初のファイルの名前を 1 つの名前に変更し、2 番目のファイルの名前を別の名前に変更します。変数が Y に設定され、if ステートメントで変数に対して遅延展開が使用されます。このコードは、SOURCE の場所から 2 つのファイルを読み取り、SOURCE の場所とファイル名を txt ファイルに配置します。したがって、ファイルは次のようになります。 \servername\Reports\531627.REPORT.CSV \servername\Reports\531638.REPORT.CSV 次に、コードはテキスト ファイルをループし、最初のファイルをコピーして名前を REPORTLST に変更し、次に 2 番目のファイルに名前を変更します。 REPORTASTに。何が起こっているのかというと、if ステートメントが無視されているようなものです。FIRSTFILE 変数を出力して Y であることを確認しましたが、最初のファイルがコピーされたり名前が変更されたりすることはありません。コードは次のとおりです。

SetLocal EnableDelayedExpansion 
@ECHO ON
if %1.==. (GOTO PARMERR) ELSE (SET ORIGFILENAME=%1)
if %2.==. (GOTO PARMERR) ELSE (SET SOURCE=%2)
if %3.==. (GOTO PARMERR) ELSE (SET DESTINATION=%3)
if %4.==. (GOTO PARMERR) ELSE (SET SMALLFILENAME=%4)
if %5.==. (GOTO PARMERR) ELSE (SET LARGEFILENAME=%5)

SET FIRSTFILE=Y 
IF EXIST %SOURCE%dirlist.txt DEL %SOURCE%dirlist.txt 
DIR %SOURCE%*%ORIGFILENAME% /B /S >> %SOURCE%DIRLIST.TXT 
FOR  /F "eol=; tokens=1* delims=," %%m in (%SOURCE%DIRLIST.TXT)  DO ( 
ECHO !FIRSTFILE!
IF !FIRSTFILE! == "Y" (                                                                                        
    COPY %%m %DESTINATION%%SMALLFILENAME%
    ECHO "IN IF"
) else (                 
   COPY %%m %DESTINATION%%LARGEFILENAME%
   ECHO "IN ELSE"                     
)
ECHO !FIRSTFILE!
set FIRSTFILE=N
ECHO !FIRSTFILE!
)
del dirlist.txt
:RENAMEERROR
ECHO ****RENAME FAILED******
 set err=4
GOTO END

:INVALIDSOURCE
ECHO ****cOULD NOT CD OR INVALID SOURCE******
set err=3
GOTO END

:INVALIDDESTINATION
ECHO ****cOULD NOT COPY OR INVALID DEST******
set err=2
GOTO END

:PARMERR
ECHO ****MISSING OR INVALID PARAMETER******
set err=1
GOTO END

set err=0
GOTO END

:END

 EndLocal
 exit /B %err%

そして、ここに印刷されたものがあります:

C:\Windows\system32>(
ECHO !FIRSTFILE!  
IF !FIRSTFILE! == Y (
COPY \\servername\Reports\531627.REPORT.CSV     \\servername\c$\Gateway\REPORTLST.csv  
ECHO "IN IF" 
)  else (
COPY \\servername\Reports\531627.REPORT.CSV  \\servername\c$\Gateway\REPORTAST.csv 
ECHO "IN ELSE"                      
)  
ECHO !FIRSTFILE!  
set FIRSTFILE=N  
ECHO !FIRSTFILE! 
) 
Y 
    1 file(s) copied.
"IN ELSE"                     
Y 
N

C:\Windows\system32>(
ECHO !FIRSTFILE!  
IF !FIRSTFILE! == "Y" (
COPY \\servername\Reports\531638.ATMRECON.CSV \\servername\c$\Gateway\REPORTLST.csv   
ECHO "IN IF" 
)  else (
COPY \\servername\Reports\531638.ATMRECON.CSV \\servername\c$\Gateway\REPORTAST.csv  
ECHO "IN ELSE"                      
)  
ECHO !FIRSTFILE!  
set FIRSTFILE=N  
ECHO !FIRSTFILE! 
) 
N
    1 file(s) copied.
"IN ELSE"                     
N
N

したがって、常に ELSE に移行していることがわかりますが、何が問題なのかわかりません。何か案は?

4

1 に答える 1

2

プログラムに指示しましたset FIRSTFILE=Y  (スペースに注意してください。これは変数の一部ですが、 にYなることはありません)。

setこれらの目に見えないスペースを回避するには、次の構文の使用に慣れてください。

set "FIRSTFILE=Y"

(引用符とその位置に注意してください)

于 2016-05-09T16:29:00.487 に答える