BATCH:记录未移动的文件
BATCH : Log for not moved files
我使用互联网上的一些示例来制作一个非常基本的批次。我的批处理的目标是将文件从源文件夹移动到目标文件夹。我的批处理位于源文件夹中,并使用 Md 命令创建目标文件夹。
在有要移动的文件列表之后,对于每个单独的文件,命令如下:
md DestinationFoldername
move "ProjectFree.zip" DestinationFoldername
move "Listofstuff.dat" DestinationFoldername
etc for 1300 lines
我为每个特定文件写一行。
我的问题:我想要一个源文件夹中不存在的文件的日志文件,我希望有一个 log.txt 包含如下信息:“ProjectFree.zip 不移动,因为文件源文件夹中不存在
我试过这个:
@echo off
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B
但它只显示“1 个文件已移动”,没有其他信息。
是否可以用我需要的信息做一个log.txt?我怎样才能通过我的蝙蝠中的简单“移动”命令实现这一目标?
@Kythe
好的,我真的只需要一个文件,所以我会选择拿这个。我只是担心小机器的速度。我要测试一下。
所以整个代码应该是这样的:
@回声关闭
设置日志文件=unsuccessfull.log
md destinationfolder
move "ProjectFree.zip" "DestinationFoldername" set %file% = "ProjectFree.zip" call :move if %errorlevel% == 1 ( echo Unsuccessful )
move "Listofstuff.dat" "DestinationFoldername" set %file% = "Listofstuff.dat" call :move if %errorlevel% == 1 ( echo Unsuccessful )
echo unsuccessfull: %errorlevel% >> unsuccessfull.log
对吗?
@ECHO Off
SETLOCAL
rem The following settings for the source directory, destination directory, target directory, report directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "reportdir=u:"
SET "filename1=%sourcedir%\q65709918.txt"
:: delete report files
FOR %%a IN (moved failmove duplicate missing) DO DEL "%reportdir%\%%a.txt" >NUL 2>nul
FOR /f "usebackqtokens=1*delims=" %%a IN ("%filename1%") DO (
IF EXIST "%sourcedir%\%%a" (
IF EXIST "%destdir%\%%a" (
rem use following line to simply report that the destination file already exists
REM >>"%reportdir%\duplicate.txt" ECHO %%a
rem use following 2 lines to overwrite destination file
ECHO y|MOVE "%sourcedir%\%%a" "%destdir%\%%a" >NUL 2>nul
IF ERRORLEVEL 1 (>>"%reportdir%\failmove.txt" ECHO %%a) ELSE (>>"%reportdir%\moved.txt" ECHO %%a)
) ELSE (
MOVE "%sourcedir%\%%a" "%destdir%\%%a" >NUL
>>"%reportdir%\moved.txt" ECHO %%a
)
) ELSE (>>"%reportdir%\missing.txt" ECHO %%a)
)
FOR %%a IN (moved failmove duplicate missing) DO IF EXIST "%reportdir%\%%a.txt" ECHO -----%%a-----&type "%reportdir%\%%a.txt"
GOTO :EOF
usebackq
选项是必需的,因为我选择在列表文件名周围添加引号。
我使用了一个名为 q65709918.txt
的文件,其中包含一些虚拟数据用于我的测试内容:
ProjectFree.zip
Listofstuff.dat
notinsource.txt
has space IN name.txt
duplicate.txt
readonlyduplicate.txt
因此,首先删除报告文件,然后读取文件q65709918.txt
以获取要移动的文件的名称。我包括了包含空格的名称、源中不存在的名称和目标中已存在的文件,包括目标中只读的文件。
我不知道你们关于重复和只读的政策,所以你可以简单地报告此事或覆盖 - 每个都有一份报告。
最后,显示每个已生成的报告...
遍历文件很容易。这使您能够对每个文件名使用相同的代码行,而不是一遍又一遍地重复相同的代码。由于您不需要单独的文件,因此可以使用批处理文件本身。它需要一些预防措施才能正常工作:
- 列表必须在脚本的末尾。
- 你需要一个唯一的行来标记数据部分的开始(我使用
REM DATA:
)(好吧,你 可以 硬编码行号,但这很难每次更改代码部分中的任何内容时都必须进行维护和调整)
- 您需要在数据部分之前添加
goto :eof
,以免无意中启动文件
- 您需要跳过代码(第一个
for
循环确定数据部分的开始位置)。第二个 for
仅遍历数据部分
您的代码可能如下所示:
@echo off
setlocal
set "Destination=foldername"
md "%destination%" 2>nul
for /f "delims=:" %%n in ('findstr /nxc:"REM DATA:" "%~dpnx0"') do set /a n=%%n
for /f "usebackq skip=%n% tokens=*" %%a in ("%~dpnx0") do (
move /y "%%a" "%Destination%\" >nul 2>&1 && (
echo moved: %%a
) || (
echo NOT moved: %%a
)
)
goto :eof
REM DATA:
ProjectFree.zip
Listofstuff.dat
notinsource.txt
has space IN name.txt
duplicate.txt
readonlyduplicate.txt
nonexistent.file
根据您的需要调整消息。
我使用互联网上的一些示例来制作一个非常基本的批次。我的批处理的目标是将文件从源文件夹移动到目标文件夹。我的批处理位于源文件夹中,并使用 Md 命令创建目标文件夹。
在有要移动的文件列表之后,对于每个单独的文件,命令如下:
md DestinationFoldername
move "ProjectFree.zip" DestinationFoldername
move "Listofstuff.dat" DestinationFoldername
etc for 1300 lines
我为每个特定文件写一行。
我的问题:我想要一个源文件夹中不存在的文件的日志文件,我希望有一个 log.txt 包含如下信息:“ProjectFree.zip 不移动,因为文件源文件夹中不存在
我试过这个:
@echo off
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B
但它只显示“1 个文件已移动”,没有其他信息。
是否可以用我需要的信息做一个log.txt?我怎样才能通过我的蝙蝠中的简单“移动”命令实现这一目标?
@Kythe
好的,我真的只需要一个文件,所以我会选择拿这个。我只是担心小机器的速度。我要测试一下。
所以整个代码应该是这样的:
@回声关闭 设置日志文件=unsuccessfull.log
md destinationfolder
move "ProjectFree.zip" "DestinationFoldername" set %file% = "ProjectFree.zip" call :move if %errorlevel% == 1 ( echo Unsuccessful )
move "Listofstuff.dat" "DestinationFoldername" set %file% = "Listofstuff.dat" call :move if %errorlevel% == 1 ( echo Unsuccessful )
echo unsuccessfull: %errorlevel% >> unsuccessfull.log
对吗?
@ECHO Off
SETLOCAL
rem The following settings for the source directory, destination directory, target directory, report directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "reportdir=u:"
SET "filename1=%sourcedir%\q65709918.txt"
:: delete report files
FOR %%a IN (moved failmove duplicate missing) DO DEL "%reportdir%\%%a.txt" >NUL 2>nul
FOR /f "usebackqtokens=1*delims=" %%a IN ("%filename1%") DO (
IF EXIST "%sourcedir%\%%a" (
IF EXIST "%destdir%\%%a" (
rem use following line to simply report that the destination file already exists
REM >>"%reportdir%\duplicate.txt" ECHO %%a
rem use following 2 lines to overwrite destination file
ECHO y|MOVE "%sourcedir%\%%a" "%destdir%\%%a" >NUL 2>nul
IF ERRORLEVEL 1 (>>"%reportdir%\failmove.txt" ECHO %%a) ELSE (>>"%reportdir%\moved.txt" ECHO %%a)
) ELSE (
MOVE "%sourcedir%\%%a" "%destdir%\%%a" >NUL
>>"%reportdir%\moved.txt" ECHO %%a
)
) ELSE (>>"%reportdir%\missing.txt" ECHO %%a)
)
FOR %%a IN (moved failmove duplicate missing) DO IF EXIST "%reportdir%\%%a.txt" ECHO -----%%a-----&type "%reportdir%\%%a.txt"
GOTO :EOF
usebackq
选项是必需的,因为我选择在列表文件名周围添加引号。
我使用了一个名为 q65709918.txt
的文件,其中包含一些虚拟数据用于我的测试内容:
ProjectFree.zip
Listofstuff.dat
notinsource.txt
has space IN name.txt
duplicate.txt
readonlyduplicate.txt
因此,首先删除报告文件,然后读取文件q65709918.txt
以获取要移动的文件的名称。我包括了包含空格的名称、源中不存在的名称和目标中已存在的文件,包括目标中只读的文件。
我不知道你们关于重复和只读的政策,所以你可以简单地报告此事或覆盖 - 每个都有一份报告。
最后,显示每个已生成的报告...
遍历文件很容易。这使您能够对每个文件名使用相同的代码行,而不是一遍又一遍地重复相同的代码。由于您不需要单独的文件,因此可以使用批处理文件本身。它需要一些预防措施才能正常工作:
- 列表必须在脚本的末尾。
- 你需要一个唯一的行来标记数据部分的开始(我使用
REM DATA:
)(好吧,你 可以 硬编码行号,但这很难每次更改代码部分中的任何内容时都必须进行维护和调整) - 您需要在数据部分之前添加
goto :eof
,以免无意中启动文件 - 您需要跳过代码(第一个
for
循环确定数据部分的开始位置)。第二个for
仅遍历数据部分
您的代码可能如下所示:
@echo off
setlocal
set "Destination=foldername"
md "%destination%" 2>nul
for /f "delims=:" %%n in ('findstr /nxc:"REM DATA:" "%~dpnx0"') do set /a n=%%n
for /f "usebackq skip=%n% tokens=*" %%a in ("%~dpnx0") do (
move /y "%%a" "%Destination%\" >nul 2>&1 && (
echo moved: %%a
) || (
echo NOT moved: %%a
)
)
goto :eof
REM DATA:
ProjectFree.zip
Listofstuff.dat
notinsource.txt
has space IN name.txt
duplicate.txt
readonlyduplicate.txt
nonexistent.file
根据您的需要调整消息。