Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 将文件从一个目录移动到另一个目录,并根据文件名将其放置在文件夹中_Batch File_Cmd_Directory - Fatal编程技术网

Batch file 将文件从一个目录移动到另一个目录,并根据文件名将其放置在文件夹中

Batch file 将文件从一个目录移动到另一个目录,并根据文件名将其放置在文件夹中,batch-file,cmd,directory,Batch File,Cmd,Directory,我需要将文件从一个目录移动到另一个目录,同时根据文件名将文件放在子目录中 背景: 文件名(建筑编号)-assign-flr-pln.dgn 新位置为F:/Assignment楼层平面图/建筑物/(建筑编号)/楼层平面图文件 批处理文件需要读取建筑编号的.dgn名称,然后将文件放置在建筑编号文件夹中相应的楼层平面子文件夹中 所以 从一个目录中获取(建筑编号)-assign-flr-pln.dgn文件并将其放置 作业平面图 -建筑物 -(楼宇编号) -楼层平面文件如果您想直接从批处理文件中执行如此复

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

背景:

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

新位置为F:/Assignment楼层平面图/建筑物/(建筑编号)/楼层平面图文件

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

所以

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

作业平面图 -建筑物 -(楼宇编号)
-楼层平面文件如果您想直接从批处理文件中执行如此复杂的操作,您需要了解一些内容

研究清单:

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
命令——这就是如何从一个环境变量中提取子字符串并将其放入另一个环境变量,执行文本替换等


这些东西在VBS或PowerShell中要容易得多。

尽管您没有显示我们可以帮助您的代码

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

使用普通的
for
循环获取每个文件。
使用
for/f
循环提取建筑物nr(根据您的注释,这是第一个用破折号分隔的标记)
使用
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
:引入另一层解析以避免
@=%%a
在变量中替换字符串

2>nul
抑制错误消息

必须批量写入吗?您的系统是否安装了python、php等脚本语言,或者您的系统是否安装了Windows10BashShell?批处理只是一种糟糕的编写方式,编写/调试会让人困惑,而且没有多大意义。那台机器上有C#编译器吗?几乎任何解决方案都比基于批次的解决方案好。建筑物编号是否总是在括号中?您是否打算将目录命名为
(建筑编号)
,也包括括号?另外,您应该注意,在这里询问编码问题时,如果不显示您的代码,请在您的帖子中包含您遇到问题的代码,并准确解释问题所在。对不起,我是Stackoverflow的新手,我没有我请求他人帮助的代码。然而,要回答你的问题,paren只是一个占位符。邪恶的程序员-使用工作机器,我们只使用CMD。因此,名为100-assig-flr-plan.dgn的文件需要放在100文件夹的floorplan子文件夹中。如果你“没有代码”,你不是在请求别人帮助“你”处理它“你是在请求别人为你做这件事,正如我说的,这是离题的。