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 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.
我在这里做错了什么?
期待您的解决方案。提前致谢。
解决方案
带有参数的命令DIR仅输出指定目录中所有非隐藏文件和目录的名称,没有路径。执行批处理文件的当前目录与. 出于这个原因,命令MOVE找不到要移动的文件/目录,在当前目录中没有指定路径,并输出错误消息。/b
"C:\Test Print Queue\"
C:\TestFoder
C:\Test Print Queue
C:\Test Print Queue
C:\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循环中成功处理,尽管默认情况下未启用且此处不需要。有关命令SETLOCAL和ENDLOCAL的详细信息,请阅读此答案。
如果目标文件夹不存在,批处理文件首先创建目标文件夹,并验证文件夹创建是否成功。
命令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 /?
推荐阅读
- r - 对于每一行,找到与特定字符串匹配的单元格并返回列名的最后一个字符
- c++ - 在 std::unordered_map 中找到一个值
- javascript - 使用 nodemailer 的联系表格不起作用
- docker - Meteor 2.2 项目的 Dockerfile
- git - 如果工作副本中的特定文件夹与存储库相同,如何使用 git diff 返回 0,如果它们不同则返回 1
- linux - *nix 主机的 sssd.conf ldap_user_search_base 多个 ous
- python - 如果它通过一个或多个 if 语句,我如何执行相同的语句?
- python - Python将循环中的数据附加到数据框中
- amazon-web-services - AWS Pre-Signed Post URL 突然停止工作
- reactjs - 如何使用 Sinon 和 ReactJS 模拟模块导入