@ECHO OFF
SETLOCAL
:: Note that SPACES are significant in simple SET statements
:: Set relative or local root (start-point of subtree to scan)
:: Use normal then safemethod 1 then safemethod2 - all do the same thing
:: Note : from the prompt,
:: command /?
:: will generally show help...
SET relroot=c:\wherever
(SET relroot=c:\wherever)
SET "relroot=c:\wherever"
:: repeat for destination directory
SET "destdir=c:\destination"
::
:: Read Artist
:: Make sure ARTISTS has no existing value, then prompt for input
::
:again
(SET artist=)
SET /p artist="Artist ? "
::
:: Check for input, exit if none
:: Note :EOF is a special predefined label meaning "END OF FILE"
:: character case is generally insignificant
::
IF NOT DEFINED artist GOTO :eof
::
:: make a new directory
:: the 2>nul suppresses an error message like 'it already exists'
:: In quotes in case variables contain spaces
MD "%destdir%\%artist%" 2>nul
::
:: Now look for filenames containing the data entered
:: Note: here, the metavariable %%i IS Case-sensitive
:: >nul means 'don't show message like '1 file(s) moved'
FOR /f "delims=" %%i IN (
' dir /s /b /a-d "%relroot%\*%artist%*" '
) DO (
ECHO %%i
IF EXIST "%destdir%\%artist%\%%~nxi" (
ECHO Cannot MOVE "%%i" because "%destdir%\%artist%\%%~nxi" exists
) else (ECHO MOVE "%%i" "%destdir%\%artist%\%%~nxi" >nul)
)
GOTO again
好吧,这是一个启动脚本 - 假设艺术家的名字在文件名中。
大多数文档是内联的。
请注意,::...
文档的形式实际上是一个损坏的标签,通常在循环和括号代码中是不可取的 - 在那里使用 REM。然而,它更容易打字,干扰更少
循环需要一点解释:其中FOR
大部分可以通过文档中的一些持久性来破译
for /?
从提示。但要注意的是:
for /f
逐行读取“文件”,并在分隔符之间进行标记后将每个连续行应用于元变量。您可以通过从 1 开始计数的数字来指定标记,分隔符是出现在 thedelims=
和右引号之间的任何字符。默认分隔符为 [空格]、[制表符]、[逗号]、[分号],默认标记为1
. "delims=" 指定没有分隔符,因此整行应用于元变量。
可以在数据行上使用此工具,例如使用 to 、Wed. 07/11/2012
toFOR/f "tokens=2,3,4delims=/ " %%i in...
和07
to -标记是, ,并且当使用 [空格或] 标记行并且将第二个标记应用于循环元变量时,通过令牌编号列表以此类推。特殊标记“ ”表示“指定的最高编号标记之后的其余行”%%i
11
%%j
2012
%%k
Wed.
07
11
2012
/
%%i
%%j
*
AND.. 单引号“文件名”是命令的输出。dir /s /b /a-d "%relroot%\*%artist%*"
是/b
基本形式的目录列表(仅文件名)/s
扫描子目录/a-d
,但不提及从 %relroot% 开始并在文件名中的某处有 %artist%的战争目录名 - 全部引用以防出现空格。