我已经在其他人的帮助下将下面的批处理文件编写了下来,但是我没有太多的经验,因此这对我来说有点困难。
我正在尝试将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
/B
仅文件名带有文件扩展名,但没有文件路径。如果指定的目录根本不存在或者没有文件匹配该模式,则DIR输出的用于处理STDERR的错误消息可以通过将其重定向2>nul
到设备NUL来抑制。
阅读有关使用命令重定向操作符的Microsoft文档,以获取有关的说明2>nul
。Windows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,>
必须^
在FOR命令行上使用脱字符号将重定向运算符转义为文字字符,该命令在后台启动的单独命令进程中执行嵌入式命令行。dir
FOR捕获写入启动命令过程的STDOUT的所有内容,并逐行处理捕获的输出。
默认情况下,FOR忽略所有空行(此处不出现)和所有以分号开头的行。文件名可以以分号开头。因此,eol=|
使用选项将行尾字符重新定义为文件名不能包含的竖线,请参阅Microsoft文档页面“命名文件,路径和命名空间”。
FOR还将使用空格/制表符作为分隔符将每一行拆分为子字符串(令牌),并且仅将第一个由空格/制表符分隔的字符串分配给指定的循环变量A
。由于文件名可以包含一个或多个空格字符,因此此处不需要这种拆分行为。因此,该选项delims=
用于定义一个空的定界符列表,该列表将完全禁用行分割,并导致将整个文件名分配给循环变量以扩展名A
。
第二个FOR仅将文件名(不带扩展名)作为字符串处理。这一次的文件名分割使用下划线作为,因为分隔符delims=_
只有第一个下划线分隔字符串循环变量赋值B
因tokens=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] 删除。
我来说两句