Batch file 系统在运行批处理文件时找不到指定的路径

Batch file 系统在运行批处理文件时找不到指定的路径,batch-file,Batch File,在将文件从一个文件夹排序到另一个文件夹后,我试图将文件移动到另一个文件夹,但我总是遇到此异常“系统找不到指定的路径” 下面是我的批处理命令代码: 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 Que

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

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

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.
我做错了什么


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

带有参数
/b
“C:\Test Print Queue\”
的命令DIR只输出指定目录中所有非隐藏文件和目录的名称,而不输出路径。执行批处理文件时的当前目录是
C:\TestFoder
,它与
C:\Test Print Queue
不同。因此,命令MOVE无法找到存储在
C:\Test Print Queue
中的要移动的文件/目录,该文件/目录在当前目录
C:\TestFoder
中没有指定路径,并输出错误消息


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

一种解决方案是在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的详细信息,请阅读

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

用于的命令执行命令行

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
的命令之前处理此命令行时,重定向操作符必须在上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动

FOR和选项
/F
捕获为处理后台命令进程的STDOUT而编写的所有内容,然后逐行处理捕获的文本

对于,会忽略空行,但使用所用选项的DIR根本不会输出空行

开头的行,默认情况下,也会忽略代码>。文件名可以以分号开头。因此,选项
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初始当前目录