如何从批处理文件中的文件夹名称中提取和使用信息(值,字符串)...

时间:2019-04-28 16:54:34

标签: batch-file

我想创建一个批处理文件来整理我的文件夹。基本上,这是我第一次编码任何东西,对不起,错误。

文件夹名称由整数和文本组成,例如:“ C:\ bad folder \ 22my folder \”

在这种情况下,我想创建新文件夹,其中文件夹名称的文本和文件按字母顺序位于整数列中。 在这里,它将创建文件夹:

C:\完成的文件夹\我的文件夹

仅包含文件

C:\完成的文件夹\我的文件夹\ 22.txt(文件夹中的第22个文件)

这是我到目前为止所做的,但这绝对可怕,我将尽力解决它:

MKDIR C:\cleaned folders\
CD C:\bad folders\
            ::I will try and make a loop for all the folders in "C:\bad folders\"

set oldfoldername=%CD%  ::the whole folder name (number+text)
set newfoldername=  ::the text in the folder name
set number=     ::the number in the folder name

mkdir C:\cleaned folders\newfoldername
CD ..


copy C:\bad folders\oldfoldername C:\cleaned folders\newfoldername
CD C:\cleaned folders\newfoldername
      ::loop maybe for all the files in "C:\cleaned folders\newfoldername"
IF (filerank) neq %number% DEL (filerank)

那么,如何从文件夹名称中获取此信息并使用呢?预先谢谢你。

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL

:: make destination directory - note quotes as md x y will create directories x and y
MKDIR "U:\cleaned folders\"

:: Read each directoryname in turn from ...\bad folders\ and assign to %%a
:: Examine a dir listing in bare format (/b) of directories (/ad). 

FOR /f "delims=" %%a IN ('dir /ad /b "u:\sourcedir\bad folders"') DO (
  rem Note REM not :: within a code block (parenthesised sequence of lines)
  rem set oldfoldername to the name found
 SET "oldfoldername=%%a"
  rem partition into newfoldername and number
 CALL :split
  REM create new destination directory and MOVE file
 CALL :cre8move
)
GOTO :EOF

:split
:: initialise destination components
SET "number="
SET "newfoldername=%oldfoldername%"

:splitlp
:: See whether the first character of newfoldername is in the string 0..9
ECHO 0123456789|FIND "%newfoldername:~0,1%">NUL
IF ERRORLEVEL 1 GOTO :EOF 

:: first character is numeric - accumulate and remove
SET "number=%number%%newfoldername:~0,1%"
SET "newfoldername=%newfoldername:~1%"
GOTO splitlp

:cre8move
:: create new destination directory
MD "U:\cleaned folders\%newfoldername%"

:: we need to skip (number - 1) lines, so calculate
SET /a skiplines=%number% - 1

:: Read the directorylist (not including directorynames /a-d), skipping number-1 names
:: Move that file (You may want to COPY) and then terminate the loop
FOR /f "skip=%skiplines%delims=" %%q IN ('dir /a-d /b "u:\sourcedir\bad folders\%oldfoldername%\*"') DO (
 ECHO MOVE "u:\sourcedir\bad folders\%oldfoldername%\%%q" "U:\cleaned folders\%newfoldername%"&GOTO :eof
)
GOTO :eof

我相信以上内容可以满足您的奇怪要求。我希望通过评论的叙述是有用的。

您没有说要移动还是复制文件。我刚刚echo编辑了必填行。根据需要进行更改。

请注意,这不适用于名称为number为0或1的目录。如果需要,可以固定这些值并不复杂,但是如后所述,演示其他值的方法似乎是在这里反对。

批次也有关于前导0的有趣想法。如果您需要保留前导0,那么会增加一些复杂性。

批处理语法需要一点时间来适应。似乎很小的更改可能是灾难性的,因此将复制粘贴到文本编辑器可能是最好的方法。不要使用文字处理程序,因为他们习惯于重新格式化文本以使其看起来合乎逻辑。

请注意,当尝试创建一个已经存在的目录时,将显示一条错误消息。这是无害但丑陋的。您可以通过在每行2>nul后面附加MD ...来抑制错误消息。

批处理对SET语句中的空格敏感。 SET FLAG = N将名为“ FLAG Space ”的变量设置为“ Space N”

使用语法SET "var=value"(值可能为空)来确保分配的值中不包括任何杂散的尾随空格。