0

所以我从网上收集了一些艺术品;它非常大,并且跨越了我将其全部保存在主文件夹下的大量子目录(名为 Uda)。我在大约 4 年的时间里建立了这个系列。在最近 2 年里,我一直在整理我保存的艺术家的东西(如果重要的话,大部分来自网站 DeviantArt)。但是我有 2 年的未分类文件,到处都是,我想对它们进行分类。

我认为这是练习一些批处理脚本的理想时机,但是……我一点也不知道从哪里开始。谷歌并不是很有帮助,很难在一个问题中解释我想做什么,更不用说找到需要同样事情并得到指导的人。另外,老实说,我更愿意拆开并找出一个已经制作好的脚本来理解它并从中学习(这就是我倾向于学习的最佳方式)。

那么任何人都可以帮助我吗?如果您不明白我想要做什么:我希望制作一个脚本,我可以在其中输入一些内容(即艺术家的姓名)并在某个目录下为其创建一个文件夹(无论批处理是从哪里运行的)或从中提取的文件)具有输入的术语的名称,然后找到并移动具有该术语的另一个目录下的所有文件。

作为记录,即使我对批处理脚本不感兴趣,我也无法使用 Windows 资源管理器搜索它们然后将它们全部删除,因为我禁用了它(出于个人原因)。

4

2 回答 2

1

我不会为你写它,但是这里列出了你必须实现的大致目标。尝试寻找其中的每一个,然后将它们组合起来

  1. 输入名称
  2. 用这个名字创建一个目录
  3. 查找具有此名称的文件
  4. 将找到的文件移动到目录

如果您发布您正在尝试的代码,我很乐意为您提供帮助。

于 2013-03-28T14:36:21.540 回答
1
@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/2012toFOR/f "tokens=2,3,4delims=/ " %%i in...07to -标记是, ,并且当使用 [空格或] 标记行并且将第二个标记应用于循环元变量时,通过令牌编号列表以此类推。特殊标记“ ”表示“指定的最高编号标记之后的其余行”%%i11%%j2012%%kWed.07112012/%%i%%j*

AND.. 单引号“文件名”是命令的输出。dir /s /b /a-d "%relroot%\*%artist%*"/b基本形式的目录列表(仅文件名)/s扫描子目录/a-d,但不提及从 %relroot% 开始并在文件名中的某处有 %artist%的战争目录名 - 全部引用以防出现空格。

于 2013-03-28T15:23:37.343 回答