将文件从一个目录移动到另一个目录,并根据文件名将它们放在文件夹中

时间:2017-08-29 15:08:24

标签: batch-file cmd directory

我需要将文件从一个目录移动到另一个目录,同时根据文件名将文件放在子目录中。

背景:

文件名(建筑物编号)-assign-flr-pln.dgn

新位置将是F:/分配楼层平面图/建筑物/(建筑物编号)/平面图文件。

批处理文件需要读取建筑物编号的.dgn名称,然后将文件放在建筑物编号文件夹中相应的平面图子文件夹中

所以...

从一个目录中获取(建筑物编号)-assign-flr-pln.dgn文件并将其放置.....

作业平面图   - 建筑物    - (建筑物编号)    -Floor Plan Files< - Here

2 个答案:

答案 0 :(得分:0)

如果您想直接从批处理文件中执行此操作,您可以学到很多东西。

研究清单:

FOR
SET
CALL

您希望使用FOR命令获取文件名;注意%~选项。例如:

set BAT_DGNFNM=
for %%F in (*.dgn) do set BAT_DGNFNM=%%~nF

这会导致环境变量BAT_DGNFNM设置为基本文件名。但是,它遍历所有文件,所以实际上,你需要它来为每个文件调用一个子程序:

for %%F in (*.dgn) do call :DODGN "%%~dpnxF" "%%~nF"

这将调用子例程:DODGN并将两个引用封装的参数传递给它;第一个是完全限定的文件名,第二个是基本文件名。

然后在子例程中执行实际的文件处理:

:DODGN
set BAT_DGNFNM=%1
set BAT_DGNBNM=%2
REM Do stuff with BAT_DGNBNM using SET commands
GOTO :EOF

你需要确保自己没有经过"完成主循环后的子程序,你应该在完成后清理你的环境变量,所以这看起来像:

@echo off
for %%F in (*.dgn) do call :DODGN "%%~dpnxF" "%%~nF"
goto ENDIT

:DODGN
set BAT_DGNFNM=%1
set BAT_DGNBNM=%2
REM Do stuff with BAT_DGNBNM using SET commands
GOTO :EOF

:ENDIT
set BAT_DGNFNM=
set BAT_DGNBNM=
祝你好运 - 这些东西会变得复杂。

最后提醒:你的大部分学习曲线都是使用SET命令 - 这是如何从一个环境变量中提取子串并将其放入另一个环境变量,执行文本替换等等。 / p>

这种东西在VBS或PowerShell中更容易。

答案 1 :(得分:0)

虽然您没有显示任何代码,但我们可以帮助您...

如果您知道要使用的命令(对于初学者来说是一个很棒的网站),这很容易:  SS64):

使用普通for循环获取每个文件 使用for /f循环提取建筑物(根据您的评论,它是由破折号分隔的第一个标记)
使用md创建目标文件夹(如果已存在则忽略错误)
使用copy复制文件 结束。

@echo off
REM prepare some files for testing:
break>100-assign-flr-pln.dgn
break>110-assign-flr-pln.dgn
break>235-assign-flr-pln.dgn

REM now copy them into their destination folders:
set "dest=Assignment Floor Plans - Buildings - @ - Floor Plan Files"
for %%f in (*-assign-flr-pln.dgn) do (
  for /f "tokens=1 delims=-" %%a in ("%%f") do (
    call md "%%dest:@=%%a%%" 2>nul
    call copy "%%f" "%%dest:@=%%a%%\"
  )
)

REM now show the result:
tree /f

注意:调整目的地(添加F:\

"特效":
call <command>:引入另一层解析以避免delayed expansion @=%%a在变量中替换字符串
2>nul禁止错误消息