如何在批处理脚本中找到我的错误?

问题描述 投票:0回答:1

下面的代码应该通过将一些文件移动到子文件夹中来归档它们。批处理文件询问用户文件夹路径。然后应该创建一个子文件夹,如果成功,它应该将用户输入目录中的所有文件移动到该子目录中。它可以工作,但尽管使用

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
batch-file
1个回答
1
投票

我建议使用这个批处理文件来执行文件移动任务。

@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 上的发送到
 来运行批处理文件,而无需手动输入文件夹路径。

如果未以文件夹路径作为第一个参数启动,或者根本找不到文件夹,则批处理文件会提示用户输入路径。此用户提示是使用安全方法完成的。批处理文件使用

PUSHDPOPD 而不是 CD 使传递或输入的文件夹暂时成为剩余命令的当前文件夹,也可以与 UNC 路径一起使用。

接下来检查该文件夹是否包含任何文件。否则,用户会被告知该目录不包含要存档的文件,并且批处理文件结束,无需任何进一步操作。

文件移动是使用

ROBOCOPY 完成的,原因在批处理文件中的注释中描述,需要 Windows Vista 或更新的 Windows 版本或 Windows Server 2003 或更新的 Windows 服务器版本。

我建议您也看看:

要了解所使用的命令及其工作原理,请打开

命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
     ...解释了 
    %~nx0
    %~dp0
    %~1
    ,其中参数 0 始终是批处理文件本身。
  • dir /?
    
    
  • echo /?
    
    
  • endlocal /?
    
    
  • for /?
    
    
  • goto /?
    
    
  • if /?
    
    
  • md /?
    
    
  • pause /?
    
    
  • popd /?
    
    
  • pushd /?
    
    
  • rem /?
    
    
  • robocopy /?
    
    
  • set /?
    
    
  • setlocal /?
    
    
用于编写此代码的其他有用文档:

  • 使用 Windows 批处理文件的单行多个命令
  • 所用的 Microsoft 文档
  • Windows 命令
  • 所使用的
  • Windows CMD 命令的 SS64 文档,特别是:
    • ROBOCOPY.exe
    • ROBOCOPY 退出代码
  • 有关
  • 使用命令重定向运算符的 Microsoft 文档 和 SS64 文档
    操作方法:重定向

注意: 重定向运算符 >

 必须在 
FOR
 命令行上用脱字符号 
^ 进行转义,以便在 Windows 命令解释器在执行执行嵌入式命令 FOR 之前处理此命令行时将其解释为文字字符dir
命令行使用单独的命令进程在后台启动,
%ComSpec% /c
'
中的命令行作为附加参数附加。

© www.soinside.com 2019 - 2024. All rights reserved.