我需要将文件从一个目录移动到另一个目录,同时根据文件名将文件放在子目录中。
背景:
文件名(建筑物编号)-assign-flr-pln.dgn
新位置将是F:/分配楼层平面图/建筑物/(建筑物编号)/平面图文件。
批处理文件需要读取建筑物编号的.dgn名称,然后将文件放在建筑物编号文件夹中相应的平面图子文件夹中
所以...
从一个目录中获取(建筑物编号)-assign-flr-pln.dgn文件并将其放置.....
作业平面图 - 建筑物 - (建筑物编号) -Floor Plan Files< - Here
答案 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
禁止错误消息