2013-06-30 118 views
0

所以,这里是我的:我创建了一个小批处理文件来记录ping测试的结果到文本文件。我想要做的是运行批处理文件并将结果日志自动移动到桌面上的特定文件夹。然后,如果目标文件名存在,则相应地自动重命名。意思是,如果File1存在,则创建File2,File3,等等等等。这是我到目前为止有:使用命令提示符批处理文件来移动并自动重命名重复文件

@echo off 
color A 
title Ping Test 
:A 
echo. 
cls 
ping google.com -n 4 > C:\Users\%username%\Desktop\pingresults.txt 
cls 
:Question 
echo. 
echo You can find the results in C:\Users\%username%\Desktop\pingresults.txt 
echo Would you like to run this test again? (Y/N) 
Set /p Choice= 
if %choice% equ y goto :A 
if %choice% equ n goto :Results 
if %choice% neq y goto :Question 
if %choice% neq n goto :Question 
:Results 
cls 
echo Would you like to view the results of the test? (Y/N) 
Set /p Choice= 
if %choice% equ y goto :OpenResults 
if %choice% equ n goto :Close 
if %choice% neq y goto :Results 
if %choice% neq n goto :Results 
:Close 
exit 
:OpenResults 
start C:\Users\%username%\Desktop\pingresults.txt 

且移动批处理文件看起来是这样的:

@echo off 
echo. 
cd C:\Users\Diesel\Desktop 
move pingresults.txt PingResults\ 
if exist pingresults.txt ren pingresults.txt=+1 
Exit. 

我不想覆盖现有文件,但它在继承命名。我找不到任何有用的文章,只使用批处理文件,他们都说使用vbs或php,我不熟悉的语言

回答

0

我有一对实用程序文件可以做到这一点,所以我可以致电从命令行或另一个批处理文件。这种管理在同一个文件夹中的文件的多个版本,我会感动你的新文件中称之为之前

用法是:

archivefile 5 "c:\temp\songs" .txt [move] 

其中5是要保留的版本数量。 本例中的基本文件名是“c:\temp\songs.txt” 并创建(在c:\temp)5个文件:如果指定move它会移动原来songs.txt否则将其复制songs_1.txt songs_2.txt songs_3.txt songs_4.txt songs_5.txt

请注意,如果您使用的是其他批处理文件(您可能需要),则需要使用call或者它不会返回到您的原始批处理文件(两个批处理文件都将退出,这不是你想要的):

call archivefile 5 "c:\temp\songs" .txt 

你需要一对批处理文件在当前目录或Windows路径。现在我想一想,archivefile_b.bat可能是主文件中的子例程,但它不会被破坏,所以我不打算修复它。

这是archivefile.bat:

@Echo off 
rem archivefile.bat - keep a number of archives of a file 
rem paramters: n rootfile extension [move|copy] 
rem n = number of files to keep. 
rem move|copy optional indicator to rename (move) the original file instead of copying it 
rem archivefile 5 "c:\temp\songs" .txt [move] 
rem 




if "%3"=="" goto usage 

set _af_n=%1 
set _af_root=%2 
set _af_ext=%3 

set _af_move=copy 
set _af_moveX=%4 
if "%_af_moveX%"=="move" set _af_move=move 

set _af_i= 
set _af_j= 

rem make sure that the first parameter (n) is numeric 
set /A _af_n=%_af_n% 
if "%_af_n%"=="0" echo Error: number of copies must be numeric (%1) & goto usage 

if not exist %_af_root%%_af_ext% echo Error: cannot locate main file: %_af_root%%_af_ext% & goto error 


rem remove the oldest file 
if exist %_af_root%_%_af_n%%_af_ext% del %_af_root%_%_af_n%%_af_ext% 

rem move up the remainder 
for /L %%i in (%_af_n%, -1, 1) do call archivefile_b %%i %_af_root% %_af_ext% 

rem copy the original 

if "%_af_move%"=="move" goto moveIt 
rem move not specified - make a copy 
copy %_af_root%%_af_ext% %_af_root%_1%_af_ext% 

goto moveCopyDone 

:moveIt 

rem need filename only for a rename 
set _af_destfile=%_af_root%_1%_af_ext% 
set _af_destfile=%_af_destfile:"=% 
for %%i in (%_af_destfile%) do set _af_destfile=%%~ni%%~xi 

ren %_af_root%%_af_ext% %_af_destfile% 



:moveCopyDone 



dir %_af_root%*%_af_ext% 


goto done 

:usage 
echo usage: archivefile n rootfile extension 
echo - n = number of archives to keep 
echo - rootfile = the root filename 
echo - extension = file extension 
echo. 
echo example: 
echo archivefile 5 "c:\Documents and Settings\gregh\My Documents\Rescued document" .txt 
goto done 

:error 
rem could maybe do something here? naa. 
goto done 

:done 

这是archivefile_b.bat,管理只是一个文件:

rem @Echo off 
rem archivefile_b.bat - helper for the archivefile routine 
rem -- juggles ONE of the archive files. 

rem paramters: n rootfile extension 
rem n = the index to move from n to n+1 
rem archivefile 5 "c:\temp\songs" .txt 
rem therefore renames c:\temp\songs_5.txt to c:\temp\songs_6.txt 


set _afb_n=%1 
set _afb_root=%2 
set _afb_ext=%3 


rem make sure that the first parameter (n) is numeric 
set /A _afb_n=%_afb_n% 
if "%_afb_n%"=="0" echo Error: (archivefile_b) number of copies must be numeric (%1) & goto done 

set /A _afb_j=%_afb_n%+1 

rem define the file names 
set _afb_fn=%_afb_root%_%_afb_n%%_afb_ext% 
set _afb_fj=%_afb_root%_%_afb_j%%_afb_ext% 

rem remove the quotes 
set _afb_fn=%_afb_fn:"=% 
set _afb_fj=%_afb_fj:"=% 

rem can only supply a filename to the ren command (not path) 
for %%i in (%_afb_fj%) do set _afb_fj=%%~ni%%~xi 

rem do the rename now 
if exist "%_afb_fn%" ren "%_afb_fn%" "%_afb_fj%" 


:done 
3

要将文件重命名为file1 [file2][...]并在桌面文件夹中移动它:

@ECHO Off &SETLOCAL 
FOR %%a IN (*.txt) DO CALL:processFile "%%~a" 
goto:eof 

:processFile 
SETLOCAL 
:loop 
SET /a fileCounter+=1 
SET "fileName=%~n1%filecounter%%~x1" 
IF EXIST "C:\Users\%username%\Desktop\%fileName%" GOTO:loop 
ECHO MOVE "%~1" "C:\Users\%username%\Desktop\%fileName%" 
ENDLOCAL 
goto:eof 

查看输出并删除单词echo b如果它看起来不错,那么在move之前。

+0

对我有意义,它应该以我需要的方式工作,但这里是我的问题: 假设我需要移动的文件的名称叫做“Test”。在这段代码中,我将“fileName”替换为“Test”? –