2016-11-22 85 views
0

首先感谢您的帮助。我试图做的是:将基于文件名的单个目录中的多个文件移动到多个文件夹

1)我有一个包含与名称的文件夹:

122098_482056_1453458.xls 
122098_482057_1453459.jpg 
122098_482057_1453460.xls 
122098_482056_1453457.jpg 

2)我想将这些文件移动到了我与名创建的文件夹:

PO_90_122118_0_US 
PO_90_122122_0_US 
PO_90_122098_0_US 

注意:文件夹名称的第三部分与文件名称的第一部分相匹配。

我试过下面的脚本导致了一个错误,分别没有做任何事情。

我已经使用delims=_作为我的文件名由字符_分隔。使用 tokens=1以便使用文件名的第一部分。

@ECHO OFF 
SETLOCAL 
SET "sourcedir=D:\2009\2nd step batch - Copy" 
SET "destdir=D:\2009\1st step batch" 
FOR /f "delims=_" %%I IN (
    'dir /b /ad "%destdir%\*" ' 
) DO (
FOR /f "tokens=1delims=(" %%s IN ("%%~I") DO (
    IF EXIST "%sourcedir%\%%s*" ECHO(MOVE "%sourcedir%\%%s*" "%destdir%\%%I\" 
) 
) 

GOTO :EOF 

此批处理文件不输出,这意味着没有发现移动文件,我不知道为什么任何线。

批处理代码将所有122098_*文件移动到文件夹PO_90_122118_0_US有什么不对?

+0

由于StackOverflow不是免费的代码编写服务,因此您需要自行尝试!当你被困住时,回到这里,分享你的代码,并精确地描述你面临的问题!阅读至少整个[旅游网页](http://stackoverflow.com/tour)并学习如何使用本网站!另请参阅以下帮助主题:[我可以在这里询问什么主题?](http://stackoverflow.com/help/on-topic)[如何提出一个好问题?](http://stackoverflow.com/help/how-to-ask)[我应该避免询问什么类型的问题?](http://stackoverflow.com/help/dont-ask) – aschipfl

+0

我为此道歉。我试过了一段代码,但之前粘贴了错误,直到找到ctrl + k函数。我在上面的代码中包含了我的尝试。 – zlim

+0

为什么使用'delims =('虽然文件名中没有'(')?/ F'循环的第一个(外部)没有'tokens'选项,所以它默认为'tokens = 1 ',这不是你想要的,我想...... – aschipfl

回答

0

这是您为此任务重写的批处理代码。

@ECHO OFF 
SETLOCAL 
SET "SourceDir=D:\2009\2nd step batch - Copy" 
SET "DestDir=D:\2009\1st step batch" 
FOR /F "tokens=1-3* delims=_" %%A IN ('DIR /AD /B "%DestDir%\*" 2^>nul') DO (
    IF EXIST "%SourceDir%\%%C_*" MOVE "%SourceDir%\%%C_*" "%DestDir%\%%A_%%B_%%C_%%D\" 
) 
ENDLOCAL 

你可能会插入ECHO留给MOVE为真正的移动在第二轮中的文件,而不ECHO之前测试的批处理文件。

对于在目标目录中找到的每个子目录,目录名将被分割为4个使用下划线作为分隔符的标记。为FOR命令行上定义

  1. PO被分配给循环变量A
  2. 90被分配给ASCII table中的下一个循环变量,即B
  3. 122098或其他实际感兴趣的数字被分配给循环变量C
  4. 并且在子目录名称中的第三个下划线之后的所有内容都被分配给循环变量D而不会进一步分裂。

IF条件检查是否存在与开始从分配给循环变量C和下划线子目录名数量的任何文件。如果此条件为真,则会移动相应的文件。

将子目录名称的全部4个部分(即当前子目录的完整名称)指定为目标目录很重要。

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • move /?
  • set /?
  • setlocal /?

2^>nul重定向由命令DIR混淆输出错误消息来处理STDERR中没有发现到设备NUL抑制它的子目录的情况。重定向运算符>必须在这里用^转义,以便在执行命令DIR时被解释为重定向运算符,而不是作为错位重定向运算符的命令FOR。另请参阅Microsoft文章Using command redirection operators

相关问题