下面的代码应该通过将一些文件移动到子文件夹中来归档它们。批处理文件询问用户文件夹路径。然后应该创建一个子文件夹,如果成功,它应该将用户输入目录中的所有文件移动到该子目录中。它可以工作,但尽管使用
pause
它还是关闭了。它不会输出任何有关语法错误或任何内容。如果有人注意到什么,请告诉我。
@echo off
SETLOCAL EnableDelayedExpansion
echo Insert path:
set /p path=
echo the path is %path%
cd %path%
echo The files will be moved to a new folder
pause
mkdir %path%\archived_files
IF EXIST "archived_files" (
for /f %%A in ('DIR /A /D /B') do (
echo %%A && move /Y %path%\%%A %path%\archived_files)
echo Folder "archived_files" created or already exists
) else ( echo Folder "archived_files" does not exist )
echo the files have been transferred
pause
ENDLOCAL
我建议使用这个批处理文件来执行文件移动任务。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BatchFileName=%~nx0"
set "BatchFilePath=%~dp0"
set "UserPath=%~1"
if defined UserPath goto ChangeFolder
:UserPrompt
set "UserPath="
set /P "UserPath=Enter path: "
rem Has the user not entered a string?
if not defined UserPath goto UserPrompt
rem Remove all double quotes from input string.
set "UserPath=%UserPath:"=%"
rem Has the user entered just one or more double quotes?
if not defined UserPath goto UserPrompt
:ChangeFolder
pushd "%UserPath%" 2>nul || (echo Folder "%UserPath%" does not exist.& goto UserPrompt)
for /F "eol=| delims=" %%I in ('dir /A-D /B 2^>nul') do goto CreateSubfolder
echo The folder does not contain any file to archive.& goto EndBatch
:CreateSubfolder
md "archived_files" 2>nul
if not exist "archived_files\" echo Failed to create subfolder: "archived_files"& goto EndBatch
rem It must be avoided that the currently running batch file is moved too.
set "ExcludeFileOption="
for %%I in ("%UserPath%\") do set "CurrentFolderPath=%%~dpI"
if "%CurrentFolderPath%" == "%BatchFilePath%" set "ExcludeFileOption= /XF "%BatchFileName%""
rem The command MOVE used with wildcard * does not move hidden files. A FOR loop
rem with MOVE is slow in comparison to usage of ROBOCOPY to move really all files.
rem The ROBOCOPY option /IS can be removed to avoid moving same files existing
rem already in the subfolder archived_files from a previous batch execution.
echo The files are moved to a new folder.
%SystemRoot%\System32\robocopy.exe . archived_files%ExcludeFileOption% /MOV /R:2 /W:5 /IS /NDL /NFL /NJH /NJS
if not errorlevel 2 if errorlevel 1 echo All files are moved successfully.
:EndBatch
popd
endlocal
pause
批处理文件可以使用文件夹路径作为参数来启动。因此,可以右键单击批处理文件,然后单击子菜单中打开的上下文菜单发送到项目桌面(创建快捷方式)。在用户桌面上创建的
.lnk
文件现在也可以通过上下文菜单或按 F2 重命名为任何有用的名称,例如 Archive files
。然后可以使用 Ctrl+X 剪切快捷方式文件,并使用 Ctrl+V 粘贴到文件夹 %APPDATA%\Microsoft\Windows\SendTo
中,以便在 发送到 上下文子菜单中包含菜单项 Archive files
。这样就可以右键单击文件夹,然后单击子菜单中打开的上下文菜单中的 Archive files
上的发送到 来运行批处理文件,而无需手动输入文件夹路径。如果未以文件夹路径作为第一个参数启动,或者根本找不到文件夹,则批处理文件会提示用户输入路径。此用户提示是使用安全方法完成的。批处理文件使用
PUSHD 和 POPD 而不是 CD 使传递或输入的文件夹暂时成为剩余命令的当前文件夹,也可以与 UNC 路径一起使用。
接下来检查该文件夹是否包含任何文件。否则,用户会被告知该目录不包含要存档的文件,并且批处理文件结束,无需任何进一步操作。文件移动是使用
ROBOCOPY 完成的,原因在批处理文件中的注释中描述,需要 Windows Vista 或更新的 Windows 版本或 Windows Server 2003 或更新的 Windows 服务器版本。
我建议您也看看:
path
作为环境变量的名称来分配用户输入的路径是一个非常糟糕的主意.
命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
...解释了
%~nx0
、
%~dp0
和
%~1
,其中参数 0 始终是批处理文件本身。
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
md /?
pause /?
popd /?
pushd /?
rem /?
robocopy /?
set /?
setlocal /?
注意: 重定向运算符 >
必须在FOR
命令行上用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行执行嵌入式命令 FOR 之前处理此命令行时将其解释为文字字符dir
命令行使用单独的命令进程在后台启动,
%ComSpec% /c
和
'
中的命令行作为附加参数附加。