如何将文件名第一部分的名称从源目录移动到目标目录?

乔治·P。

我已经在其他人帮助下将下面的批处理文件编写了下来,但是我没有太多的经验,因此这对我来说有点困难。

我正在尝试将PDF文件从特定位置传输到另一个位置的单个文件夹。每个文件名都采用这种格式,RANSOM-NH_2018-08-07_5485A635.pdf并且基于RANSOM-NH_批处理文件应将PDF文件传输/移动到相应的适当文件夹中,如此类RANSOM-NH_Ransom INC因此,应基于文件名的开头部分将文件移至其名称以文件名的第一部分开头的文件夹。

文件和文件夹名称的一些示例:

档案名称:

RANSOM-NH_2018-06-20_2018_5849.pdf
GREENWOOD_2018-07-02_66902.pdf
GLSCIENCES_2018-07-24_24811.pdf
CPI_2018-08-01_20039035.pdf
ALDR_2018-08-08_545477636.pdf
ACCQTRAX_2018-07-26_173845.pdf

资料夹名称:

RANSOM-NH_Ransom INC
GREENWOOD_Greenwood Products, Inc
GLSCIENCES_GL Sciences, Inc
CPI_CPI International
ALDR_Sigma-Aldrich, Inc
ACCQTRAX_AccQtrax

我的问题是编写的脚本仍将文件移动到RANSOM-NH8_了完全不应该使用的同一文件夹中。

@ECHO OFF
SETLOCAL
SET "sourcedir=C:\Users\Alpha\Documents\NOTEPAD Coding\File Transfer Coding\Files"
SET "destdir=C:\Users\Alpha\Documents\NOTEPAD Coding\File Transfer Coding\Transfer"
FOR /f "delims=" %%a IN ('dir /b /a-d "%sourcedir%\*.pdf" ') DO (
    FOR /f "tokens=1 delims=_-" %%b IN ("%%a") DO (
        FOR /f "delims=" %%d IN ('dir /b /ad "%destdir%\*%%b*" ') DO (
            MOVE "%sourcedir%\%%a" "%destdir%\%%d\"
        )
    )
)
GOTO :EOF
莫菲

尝试以下批处理文件代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files"
set "DestDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer"

for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%\*_????-??-??_*.pdf" 2^>nul') do (
    for /F "eol=| tokens=1 delims=_" %%B in ("%%~nA") do (
        for /D %%C in ("%DestDir%\%%B_*") do move /Y "%SourceDir%\%%A" "%%C\"
    )
)

endlocal

第一个FOR在单独的命令过程中执行,该过程以后台cmd.exe /C命令行开始:

dir /B /A-D-H "C:\Users\Alpha\Documents\NOTEPAD Coding\File Transfer Coding\Files\*_????-??-??_*.pdf" 2>nul

DIR在指定目录中搜​​索

  • 只是由于非隐藏文件而引起的/A-D-H(属性不是目录,也不是隐藏的)
  • 匹配通配符模式*_????-??-??_*.pdf,也可能只是*_*.pdf
  • 并输出以纯格式处理STDOUT,因为/B仅文件名带有文件扩展名,但没有文件路径。

如果指定的目录根本不存在或者没有文件匹配该模式,则DIR输出的用于处理STDERR的错误消息可以通过将其重定向2>nul到设备NUL抑制

阅读有关使用命令重定向操作符的Microsoft文档,获取有关的说明2>nulWindows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,>必须^FOR命令行使用脱字符号将重定向运算符转义为文字字符,该命令在后台启动的单独命令进程中执行嵌入式命令行。dir

FOR捕获写入启动命令过程的STDOUT所有内容,并逐行处理捕获的输出。

默认情况下,FOR忽略所有空行(此处不出现)和所有以分号开头的行。文件名可以以分号开头。因此,eol=|使用选项将行尾字符重新定义为文件名不能包含的竖线,请参阅Microsoft文档页面“命名文件,路径和命名空间”

FOR还将使用空格/制表符作为分隔符将每一行拆分为子字符串(令牌),并且仅将第一个由空格/制表符分隔的字符串分配给指定的循环变量A由于文件名可以包含一个或多个空格字符,因此此处不需要这种拆分行为。因此,该选项delims=用于定义一个空的定界符列表,该列表将完全禁用行分割,并导致将整个文件名分配给循环变量以扩展名A

第二个FOR仅将文件名(不带扩展名)作为字符串处理。这一次的文件名分割使用下划线作为,因为分隔符delims=_只有第一个下划线分隔字符串循环变量赋值Btokens=1好吧,这tokens=1是使用的默认设置for /F,因此可以从代码中删除此选项字符串。

因此,第一个FOR分配给A例如RANSOM-NH_2018-08-07_5485A635.pdf,第二个FOR处理RANSOM-NH_2018-08-07_5485A635并分配给B字符串RANSOM-NH

第三个带选项的FOR/D在目标目录中搜索非隐藏目录,该目录以分配给循环变量的字符串B和下划线开头。如果找到了这样的目录,则将其具有完整路径的名称分配给循环变量C并执行命令MOVE

通过覆盖文件目标目录中具有相同名称的现有文件,文件从源移动到目标目录中的现有子目录。

当从来没有下划线开头的PDF文件或日期部分之前有多个下划线的PDF文件时,可以优化第二个FOR循环。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files"
set "DestDir=%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer"

for /F "eol=| tokens=1* delims=_" %%A in ('dir /B /A-D-H "%SourceDir%\*_????-??-??_*.pdf" 2^>nul') do (
    for /D %%C in ("%DestDir%\%%A_*") do move /Y "%SourceDir%\%%A_%%B" "%%C\"
)

endlocal

该选项tokens=1*导致根据ASCII表文件名的第一个下划线定界部分分配给循环变量A,将文件名的其余部分分配给下一个循环变量B而无需进一步区分下划线。

但请考虑到优化版本不适用于文件名,例如

  • _RANSOM-X_2018-08-07_5485A635.pdf ...在开始时要强调下划线,或者
  • RANSOM-Y__2018-08-07_5485A635.pdf ...迄今有不止一个下划线的部分。

可以将优化版本进一步优化为单个命令行:

@for /F "eol=| tokens=1* delims=_" %%A in ('dir /B /A-D-H "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\*_????-??-??_*.pdf" 2^>nul') do @for /D %%C in ("%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer\%%A_*") do @move /Y "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\%%A_%%B" "%%C\"

好吧,未优化的版本也可以写成更长的单个命令行:

@for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\*_????-??-??_*.pdf" 2^>nul') do @for /F "eol=| tokens=1 delims=_" %%B in ("%%~nA") do @for /D %%C in ("%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Transfer\%%B_*") do @move /Y "%UserProfile%\Documents\NOTEPAD Coding\File Transfer Coding\Files\%%A" "%%C\"

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何基于文件名的第一部分和第二部分创建文件夹并将文件移动到该文件夹中?

如何仅使用文件名的一部分将一个文件从一个目录移动到另一个没有 R 的目录?

如何使用 R 在大目录中通过文件名的第一部分组合两个 .xls 文件?

重命名Linux中文件名的第一部分?

Bash:如何从for循环中的多个文件的数组中删除目录的第一部分?

根据文件名的一部分将文件移动到文件夹

Shell脚本,用于将文件从源目录移动到目标目录

我如何将文件名提取为两部分,一部分进入目录,另一部分进入目录?

重写规则,但忽略目录的第一部分?

获取目录中每个文件名的一部分

创建 Automator 文件夹操作以根据文件名的一部分自动创建目录,然后移动到服务器上的新目录

如果文件夹名称包含文件名的一部分,则将文件移动到文件夹?

如何将文件名的一部分转换为文件扩展名?

如何删除哈希文件中文件路径的第一部分?

如何将 Excel 文件名的一部分存储在 Python 整数变量中

用于制作新目录的批处理脚本,作为文件名的一部分命名并在其中移动文件

如何在目录中查找知道名称一部分的文件

如果/ home目录已经是/分区的一部分,如何将其移动到另一个分区?

如何在 Swift 中僅讀取文件的第一部分?

读取文件时如何删除行的第一部分?

如何一次将多个文件移动到特定的目标目录?

Bash脚本可删除目录下每个文件中文件名的一部分

根据文件名的一部分将文件复制到另一个目录

使用蝙蝠根据名称的一部分将文件移动到文件夹

如何将一部分文件名导入字段

批处理文件以分割文件名,并使用一部分将新的子目录移入

jQuery 100%滚动到第一部分

PHP使用已知文件名的一部分移动文件

根据文件名的一部分搜索和移动文件