从批处理文件中带有空格的文件名中提取数据

从批处理文件中带有空格的文件名中提取数据

我有一个批处理文件,它通过从文件名中抓取前 6 个字符并将其移动到包含提取字符的文件夹中来移动文件列表。我需要更进一步,将文件名中的年份提取到一个变量中。我遇到的问题是这些文件的命名约定包含空格。因此,当我运行当前的批处理文件时,它仅适用于前 6 个字符。

我从这里建模: 在批处理文件中根据文件名的前 5 个字符创建文件夹

我现在使用的文件名如下:

123456 - 2020 Information.pdf 
654321 - 2022 Documentation.pdf 
111111 - 2019 Additional Docs.pdf

我想将年份(中间)提取到一个变量中,因为除了将其移动到帐户文件夹之外,我们还需要将这些文件存储在该年的“全部捕获”文件夹中。因此,我想将文件复制到该文件夹​​,然后将其移动到正确的帐户文件夹。我目前有多个批处理文件(每年一个)用于执行此操作,但我想要一个简化的单个文件,因为许多不同年份的文件都在同一个文件夹中。

我尝试了网上找到的一些方法,包括在 FOR 循环中设置“usebackq”选项,以及在变量的“set”两边添加引号。但问题似乎发生在 FOR 循环本身:

    for /f %%a in ('dir /a:-d /b') do (
  if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a"
)

在此之后的另一个页面(上面链接)的示例中,您有一个“%~1”变量可以使用,但是当我输出该变量时(在我对其执行任何操作之前)它只是文件名的前 6 个字符。

因此,任何关于如何将整个文件名放入变量的建议都将受到赞赏。

这是我当前的整个批处理文件(添加了“年份”行):

@echo

set scanfolder=\\mainserver\files\scans\
set accountfolder=\\mainserver\accounts\

for /f %%a in ('dir /a-d /b') do (
  if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a"
)
goto :EOF

:func

set file=%~1
set dir="p%file:~0,6%"
set year="%file:~9,13%"
copy /-Y "%file%*.pdf" "%scanfolder%%year%"
IF NOT EXIST %accountfolder%%dir% GOTO EOF
move /-Y "%file%*.pdf" "%accountfolder%%dir%" 
goto :EOF

:EOF

相关内容