希望你能帮我解决这个问题,我无法让它成为我需要的工作
我需要从源文件夹中复制所有.pdf文件,创建一个名为“T-123456”的文件夹,并在目标文件夹中添加找到正确文件夹中的相应PDF文件,但有时候会输入名称它变化或参考变化“SM17-123”。
文件示例
HC002T-1234562436787004332
MV002T-1234562436787004332
PP _002_T-123456_24_3678_7004332
指导文件的类型
HC123CLG-32-172436787004259
HC123SM17-1802436787004044
我创建了这个代码,但是它成为了工作的一部分,因为名称变化并且创建文件夹对于那些文件不正确,有时文件在开始示例001或0001中有更多数字,所以我不知道如何省略其他引用文件,只有工作蒙特文件“T-123456”我也需要批量连续工作在源文件夹中创建的新文件,如果我有另一个路径,我有其他类型的文件,并复制到正确的参考,这将是伟大的
@echo off
title Electronic File
:loop
cls
timeout -t 1 >nul
color b
for %%A in (*.pdf) do (
echo File Found %%A
for /f "delims=" %%B in ("%%A") do set fname=%%~nB
for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
for /f "tokens=1* delims=" %%D in ("!fname:~5,8!") do set folname=%%D
echo Name folder !folname!
if not exist "!folname!" (
echo Folder !folname! dont exist, creating
md "!folname!" 2>nul
) else (
echo Folder !folname! exists
)
echo Copying file %%A to folder !folname!
xcopy "%%A" "!folname!"
)
echo on
md "C:\test %All%"
xcopy /s /y "X:\test\pdf" "W:\Electronic File %All%"
goto :loop
pause
答案 0 :(得分:0)
for %%A in (*.pdf) do (
echo File Found %%A
set fname=%%~nA
set fextn=%%~xA
set folname=!fname:~5,8!
ECHO !folname!|FINDSTR /i /r "[A-Z]-[0-9][0-9][0-9][0-9][0-9][0-9]" >NUL
IF ERRORLEVEL 1 (
ECHO %%A - !folname! excluded
) ELSE (
echo Name folder !folname!
if not exist "!folname!" (
echo Folder !folname! dont exist, creating
ECHO md "!folname!" 2>nul
) else (
echo Folder !folname! exists
)
echo Copying file %%A to folder !folname!
ECHO xcopy "%%A" "!folname!"
)
)
这是问题的关键。 delayedexpansion
需要启用 - 您不会在原始代码中显示该内容。
请注意,%%B
,%%C
,%%D
不需要在循环中,%%A
包含文件名,因此您可以set
该名称的变量。
请注意,fextn
显然始终为.pdf
,因为这是您在文件掩码*.pdf
中指定的扩展名,因此设置它似乎是多余的。
语法SET "var=value"
(其中value可以为空)可用于确保任何杂散尾随空格不包含在分配的值中。
我引入的更改是echo
目录名为findstr
,/i
不区分大小写/r
errorlevel
正则表达式,即一个字母,a破折号然后6个数字。如果目录名匹配,则0
将findstr
设置为1
,否则将设置为if errorlevel 1
。
echo
表示“如果errorlevel为1或更高”,如果是,则匹配 UN 成功,因此报告文件名和提取的目录名;否则,请完成您的逻辑(我已将其更改为md
xcopy
和for %%A in (*.pdf) do (
echo File Found %%A
set "copied="
set fname=%%~nA
set fextn=%%~xA
set folname=!fname:~5,8!
ECHO !folname!|FINDSTR /i /r "[A-Z]-[0-9][0-9][0-9][0-9][0-9][0-9]" >NUL
IF not ERRORLEVEL 1 call :process "%%A"
rem repeat this section for each match required - begin
if not defined copied (
set folname=!fname:~5,9!
ECHO !folname!|FINDSTR /i /r "[A-Z][A-Z][A-Z]-[0-9][0-9]-[0-9][0-9]" >NUL
IF not ERRORLEVEL 1 call :process "%%A"
)
rem repeat this section for each match required - end
if not defined copied ECHO %%A - !folname! excluded
)
goto :eof
:process
echo Name folder %folname%
if not exist "%folname%" (
echo Folder %folname% dont exist, creating
ECHO md "%folname%" 2>nul
) else (
echo Folder %folname% exists
)
echo Copying file %~1 to folder %folname%
ECHO xcopy "%~1" "%folname%"
set "copied=Y"
goto :eof
命令,以进行测试。
鉴于我们现在有一个变量结构,
PP
在您的扩展示例中,不清楚set
适合该方案的位置。
公式相当简单。起始位置是regex
中的第一个参数(从第一个字符开始计算= 0),第二个参数是要选择的长度。 .
匹配可以是单个字符(字面匹配)或[rangestart-rangeend] HC123CLG-32-172436787004259
匹配任何一个字符,因此我显示的第一个块从CLG-32-17
中选择9个字符的第5个字符(从0开始)= errorlevel
并将其与alpha,alpha,alpha, - ,numeric,numeric, - ,numeric,numeric匹配。
在匹配项中,0
设置为:process
,因此call
子例程为%%A
,引号中的参数为folname
。子例程使用%1
中的值并复制文件(现在%~1
中的名称 - regex
删除引号)。
所以 - 它就像重复代码块一样简单,改变要选择的字符串的开始和长度,并更改function searchStrings(){
searchString('hello world');
searchString('Goodbye');
}
RedactAddin.searchStrings = searchStrings;
function searchString(input) {
// Run a batch operation against the Word object model.
Word.run(function (context) {
//...... (same as the original) ...............
以适应所需的模式。