Batch file 如何在批处理脚本中找到错误?

Batch file 如何在批处理脚本中找到错误?,batch-file,Batch File,下面的代码应该通过将一些文件移动到子文件夹来存档它们。批处理文件向用户询问文件夹路径。然后应该创建一个子文件夹,如果成功,它应该将用户输入目录中的所有文件移动到子目录中。它可以工作,但它会关闭,尽管使用了暂停。它不输出任何关于语法错误或任何东西。如果有人注意到什么,请告诉我 @echo off SETLOCAL EnableDelayedExpansion echo Insert path: set /p path= echo the path is %path% cd %path% e

下面的代码应该通过将一些文件移动到子文件夹来存档它们。批处理文件向用户询问文件夹路径。然后应该创建一个子文件夹,如果成功,它应该将用户输入目录中的所有文件移动到子目录中。它可以工作,但它会关闭,尽管使用了
暂停
。它不输出任何关于语法错误或任何东西。如果有人注意到什么,请告诉我

@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键重命名为任何有用的名称,如
存档文件
。然后,可以使用Ctrl+X剪切快捷方式文件,并使用Ctrl+V将其粘贴到文件夹
%APPDATA%\Microsoft\Windows\SendTo
中,以便在发送到上下文子菜单中设置菜单项
存档文件
。这样就可以右键单击文件夹,然后在
存档文件
上的子菜单发送到的打开上下文菜单中单击,以运行批处理文件,而无需手动输入文件夹路径

如果批处理文件不是以文件夹路径作为第一个参数启动,或者根本找不到文件夹,则会提示用户输入路径。此用户提示使用安全方法完成。批处理文件使用PUSHDPOPD而不是CD将传递或输入的文件夹临时用作剩余命令的当前文件夹

如果文件夹中包含任何文件,则选中next。否则,将通知用户目录不包含要存档的文件,批处理文件将结束,无需任何进一步操作

由于批处理文件中备注中所述的原因,文件移动使用ROBOCOPY完成,该批处理文件需要Windows Vista或更新的Windows版本或Windows Server 2003或更新的Windows Server版本

我还建议看:

  • 这回答了你的问题
  • 它解释了为什么将
    path
    作为环境变量的名称来分配用户输入的路径是一个非常糟糕的主意
  • 它解释了使用附加代码评估用户输入的字符串的原因
  • 它解释了环境变量(重新)定义的推荐语法以及为什么使用此语法
  • 介绍初学者在批处理文件编码中遇到的几个常见问题,如不将文件/文件夹路径括在双引号中
要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。解释
    %~nx0
    %~dp0
    %~1
    ,其中参数0始终是批处理文件本身
  • dir/?
  • echo/?
  • endlocal/?
  • 获取/?
  • goto/?
  • 如果/?
  • md/?
  • 暂停/?
  • popd/?
  • pushd/?
  • rem/?
  • robocopy/?
  • 设置/?
  • setlocal/?
用于编写此代码的其他有用文档:

  • 使用的Microsoft文档
  • 所使用的SS64文件,尤其是:
  • 有关
    的Microsoft文档 以及SS64文档

注意:重定向操作符
必须在上用插入符号
^
转义,以便在Windows命令解释器处理此命令行时,将命令行解释为文字字符,然后再执行执行执行嵌入的
目录的命令单独命令进程中的命令行在后台启动,使用
%ComSpec%/c
'
中的命令行作为附加参数追加。

切勿将
路径
用作用户变量。它是一个由操作系统设置的“神奇变量”,告诉windows在哪里查找不在当前目录中的可执行文件。使用另一个名称。调试批处理脚本的第一步是删除
@echo off
行并运行它以查看它的功能。第二步是要记住,
%PATH%
是一个系统变量,除非您知道自己在做什么,否则永远不要更改它的值。调试文件的最佳方法之一是检查它使用的每个命令的使用信息。您可以通过使用这些命令的内置帮助参数调用这些命令来实现这一点。请打开命令提示窗口,键入
dir/?
,然后阅读显示的信息。您应该注意,您很可能不希望以宽列排序格式列出文件,
/D
,更可能希望输出不带目录属性的内容,即带有
-D
/a
。例如
DIR/A:-D/B
,或
DIR/A-D/B
。您可以使用
cd/?
进行类似的操作,它还有一个
/D
选项。。。。当然,不要通过“双击”来执行它。打开一个
cmd
窗口并从那里启动它。这样,窗口将保持打开状态,允许您阅读任何错误消息。谢谢大家,我做了更改,发现了错误