首页 > 解决方案 > 运行批处理文件时系统找不到指定的路径

问题描述

我试图在将文件从一个文件夹排序到另一个文件夹后移动文件,但我总是遇到这个异常“系统找不到指定的路径”

下面是我的批处理命令代码:

setlocal EnableDelayedExpansion
set destinationFolder=C:\Test_Actual_Queue
rem Create an array with filenames in right order
for /f "tokens=*" %%f in ('dir /b "C:\Test Print Queue\" ^| sort') do (
 echo %%f
 move %%f %destinationFolder%
)
pause

我能够在控制台中对文件名进行排序和显示,但是当我尝试移动到目标文件夹时,我得到了上述异常。

两个文件夹路径都是正确的。

我尝试调试,这是我在控制台中获得的数据:

C:\TestFoder>setlocal EnableDelayedExpansion

C:\TestFoder>set destinationFolder=C:\Test_Actual_Queue

C:\TestFoder>rem Create an array with filenames in right order

C:\TestFoder>for /F "tokens=*" %f in ('dir /b "C:\Test Print Queue\" | sort') do (
echo %f
 move %f C:\Test_Actual_Queue
)

C:\TestFoder>(
echo data1.Print_Job
 move data1.Print_Job C:\Test_Actual_Queue
)
data1.Print_Job
The system cannot find the file specified.

C:\TestFoder>(
echo data2.Print_Job
 move data2.Print_Job C:\Test_Actual_Queue
)
data2.Print_Job
The system cannot find the file specified.

我在这里做错了什么?

期待您的解决方案。提前致谢。

标签: batch-file

解决方案


带有参数的命令DIR仅输出指定目录中所有非隐藏文件和目录的名称,没有路径。执行批处理文件的当前目录与. 出于这个原因,命令MOVE找不到要移动的文件/目录,在当前目录中没有指定路径,并输出错误消息。/b"C:\Test Print Queue\"C:\TestFoderC:\Test Print QueueC:\Test Print QueueC:\TestFoder

如果另外使用选项也在子目录中搜索,命令DIR将输出带有完整路径的文件/文件夹名称。/S

一种解决方案是也在MOVE命令行上指定源路径:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "SourceFolder=C:\Test Print Queue"
set "DestinationFolder=C:\Test_Actual_Queue"
set "CreatedFolder="

if not exist "%DestinationFolder%\" (
    md "%DestinationFolder%" 2>nul
    if not exist "%DestinationFolder%\" (
        echo Error: Failed to create folder "%DestinationFolder%"
        goto EndBatch
    )
    set "CreatedFolder=1"
)

for /F "eol=| delims=" %%I in ('dir /A-D-H /B /ON "%SourceFolder%\*" 2^>nul') do (
    echo Moving file "%SourceFolder%\%%I" ...
    move "%SourceFolder%\%%I" "%DestinationFolder%\"
)

if defined CreatedFolder rd "%DestinationFolder%" 2>nul

:EndBatch
endlocal
pause

for /F尽管默认启用,但根据需要显式启用命令扩展。延迟的环境变量扩展被显式禁用,因为此任务不需要。如果显式启用延迟环境变量扩展,则文件名中带有一个或多个感叹号的文件无法在FOR循环中成功处理,尽管默认情况下未启用且此处不需要。有关命令SETLOCALENDLOCAL的详细信息,请阅读此答案

如果目标文件夹不存在,批处理文件首先创建目标文件夹,并验证文件夹创建是否成功。

命令FOR执行命令行

dir /A-D-H /B /ON "C:\Test Print Queue\*" 2>nul

在以cmd.exe /C.

命令DIR输出

  • 只是非隐藏文件,因为/A-D-H这意味着所有目录条目都没有属性目录或隐藏集
  • 裸格式,因为/B这意味着只有带有文件扩展名且没有文件路径的文件名
  • 按名称排序,因为/ON
  • C:\Test Print Queue在与通配符模式匹配的目录中找到*(任何文件)。

源目录可能根本不存在或不包含任何符合条件的文件。在这些情况下,DIR输出的错误消息通过将其从句柄STDERR重定向到设备NUL来抑制。

另请阅读有关使用命令重定向运算符的Microsoft 文章,了解2>nul. 当 Windows 命令解释器在执行命令FOR之前在后台启动的单独命令进程中执行嵌入式命令行时,重定向运算符>必须^FOR命令行上使用脱字符进行转义,以将其解释为文字字符。dir

此处使用的FOR with option/F捕获为处理后台命令进程的STDOUT而编写的所有内容,然后逐行处理捕获的文本。

FOR忽略空行,但带有已使用选项的DIR根本不输出空行。

默认情况下,以开头的行;也会被FOR忽略。文件名可以以分号开头。出于这个原因,选项eol=|用于将行尾字符从分号(默认)更改为文件名根本不能包含的竖线。

FOR将使用默认分隔符空格和水平制表符将每行拆分为子字符串(标记),并将仅分配给循环变量I的第一个空格/制表符分隔的字符串。这里不需要这种拆分行为,因此选项delims=用于定义一个空的分隔符列表以禁用行拆分并I始终分配给整个文件名,即使包含一个或多个空格也是如此。tokens=*也可用于将整行(= 文件名)分配给I.

对于DIR输出的每个带有名称和扩展名但没有路径的文件,输出文件的名称并执行命令MOVE将文件移动到目标文件夹,而不会覆盖该文件夹中的同名文件,因为/Y未使用选项这里。

最后,如果目标文件夹是由批处理文件创建的,并且由于根本没有要移动的文件而仍然为空,则批处理文件将删除目标文件夹。

另一种解决方案是将当前目录更改为源目录。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
cd /D "C:\Test Print Queue" || goto EndBatch

set "DestinationFolder=C:\Test_Actual_Queue"
set "CreatedFolder="

if not exist "%DestinationFolder%\" (
    md "%DestinationFolder%" 2>nul
    if not exist "%DestinationFolder%\" (
        echo Error: Failed to create folder "%DestinationFolder%"
        goto EndBatch
    )
    set "CreatedFolder=1"
)

for /F "eol=| delims=" %%I in ('dir /A-D-H /B /ON 2^>nul') do (
    echo Moving file "%%I" ...
    move "%%I" "%DestinationFolder%\"
)

if defined CreatedFolder rd "%DestinationFolder%" 2>nul

:EndBatch
endlocal
pause

如果命令CD由于不存在而无法将当前目录更改为源目录,则会输出众所周知的错误消息:

该系统找不到指定的路径。

然后批处理文件跳转到标签EndBatch以恢复以前的环境并暂停批处理文件执行,直到用户按下任意键。

成功更改当前目录后,批处理文件将继续,并使用命令ENDLOCAL将初始当前目录C:\TestFoder再次设置为执行批处理文件的命令进程的当前目录。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • cd /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • md /?
  • move /?
  • pause /?
  • rd /?
  • set /?
  • setlocal /?

推荐阅读