我想创建一个批处理文件来整理我的文件夹。基本上,这是我第一次编码任何东西,对不起,错误。
文件夹名称由整数和文本组成,例如:“ 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)
那么,如何从文件夹名称中获取此信息并使用呢?预先谢谢你。
答案 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"
(值可能为空)来确保分配的值中不包括任何杂散的尾随空格。