gpt4 book ai didi

windows - 将文件夹移动到自己的第一个字母目录中

转载 作者:行者123 更新时间:2023-12-03 11:10:00 28 4
gpt4 key购买 nike

我使用此脚本将文件夹移动到他们自己的第一个字母目录中

@echo off
setlocal enabledelayedexpansion

tree
for /d %%i in (*) do (
set first=%%i
set first=!first:~0,1!
md !first! 2>nul
if not "!first!" == "%%i" move "%%i" "!first!\%%i"
)
tree
此脚本生成首字母目录。例如,如果我有这样的文件夹名称
Wachenfeldt - The
Пламень - Чужие
Von Stroheim - Lov
该脚本生成的第一个字母目录可能是
W
П
V
如果前一个字母目录已经存在,我不会测试此脚本
为什么会出问题呢?脚本之所以能够部分正常工作,是因为许多文件夹没有移到他们自己的第一个字母目录中,也没有移到CMD中,我读到此错误消息:

file name or extension is too long


My result
移动的文件夹名称示例
Wachenfeldt - The Interpreter (2019) Progressive Death Metal
Whitby Bay - Gothic Attack Vehicle (2018) Black Metal
Пламень - Чужие (2017) Black Metal (D5)

W
|
|---- Wachenfeldt - The Interpreter....
|----- Whitby Bay - Gothic Attack....

П
|
|----- Пламень - Чужие (20...
没有将 移至的文件夹名称示例(脚本不适用于它们)
Withering Night - Within The Shadows We Lurk (2013) Black Metal (D5)
Woltemade - Siele Vir Die See (2019) Melodic Death Metal
Von Stroheim - Love_ Who Gets Love_ (2019) Doom_Post-Metal

最佳答案

对于此文件夹移动任务,我建议使用以下批处理代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\tree.com
for /F "eol=| delims=" %%I in ('dir /AD /B 2^>nul') do (
set "FolderName=%%I"
setlocal EnableDelayedExpansion
set "TargetFolder=!FolderName:~0,1!"
if not "!TargetFolder!" == "!FolderName!" (
md "!TargetFolder!" 2>nul
move /-Y "!FolderName!" "!TargetFolder!\"
)
endlocal
)
%SystemRoot%\System32\tree.com
endlocal
对于将文件夹移动到子文件夹中的任务,最重要的是首先将整个文件夹名称 列表加载到内存中,然后使用 FOR 循环处理每个文件夹名称。在仅使用 for /d %%i in (*) do时,命令 FOR 遍历一个文件夹名称列表,直接从文件系统中按名称获取名称,并且此列表随循环内每次执行命令而更改,因为可能创建了一个额外的文件夹并移动了一个文件夹进入子文件夹。这很容易导致一个文件夹被多次处理(这里没有问题),或者由于 FOR 遍历列表而在当前文件夹中更改了文件夹而被跳过。特别是在目录项未按字母顺序在本地排序的FAT32和exFAT驱动器上,首先获取加载到内存中的文件夹的完整列表,然后开始遍历内存中列表中的文件夹是非常重要的。通过在循环中执行命令期间对文件系统进行修改来实现。
FOR /F选项的结果是在后台启动另一个命令过程,其中 %ComSpec% /c'中的命令行附加为附加参数。如此执行是在Windows中将Windows安装到 C:\Windows中执行的:
C:\Windows\System32\cmd.exe /c dir /AD /B 2>nul
由后台命令进程执行的命令 DIR 在当前目录中搜索
  • 只是由于选项/AD(属性目录)而包含的文件夹,其中包括具有for /D
  • 忽略的隐藏属性集的文件夹
    由于选项 /B
  • 仅以裸格式输出不带路径的文件夹名称。

  • 阅读有关 Using command redirection operators的Microsoft文档,以获取 2>nul的说明。 Windows命令解释器在执行命令 FOR 之前执行Windows命令行解释程序处理的命令行时,重定向操作符 >必须在 FOR 命令行上使用脱字符号 ^进行转义,以将其解释为文字字符在背景中。
    在完成命令 DIR的执行后,启动的命令进程终止自身后,正在处理批处理文件的命令进程将捕获为处理已启动的命令进程的 STDOUT 而编写的输出,并由 FOR 逐行解释该输出。 。
    FOR (带有选项dir)默认情况下会忽略空行,这在这里没有问题。默认情况下,使用普通空格和水平制表符作为字符串定界符,将一行分成多个子字符串。该行拆分行为被/F禁用,该文件定义了一个空的定界符列表,因为文件夹名称可以包含一个或多个空格。如果第一个子字符串(在这种情况下为整行)以默认的行结束符delims=开头,则也将忽略该行,此处不希望这样做,因为文件夹名称可以以分号开头。 ;将行尾的字符重新定义为竖线,该竖线不能像eol=|?一样包含任何文件夹名称,也可以使用。
    在将当前文件夹名称分配给环境变量时,未启用而不启用,因为否则,批处理文件将无法正确处理包含一个或多个*的文件夹名称。如果已经在处理此命令行时启用了延迟的环境变量扩展,则Windows命令处理器会将文件夹名称中的感叹号解释为命令行!上的延迟的扩展环境变量引用的开始/结尾。
    另请参阅:Delayed expansion
    但是有必要为其他命令启用延迟扩展,例如How does the Windows Command Interpreter (CMD.EXE) parse scripts?所描述的,因此现在使用set "FolderName=%%I"命令启用延迟扩展。
    重要的是在以下命令行中始终引用具有延迟扩展的环境变量setlocal EnableDelayedExpansion,并且不要使用FolderName处理带有一个或多个感叹号的正确文件夹名称。
    如果当前文件夹名称还不是一个字 rune 件夹名称,则当前处理的文件夹将移动到名称为当前文件夹名称的第一个字符的子文件夹中,并且当然,目标文件夹的创建也将成功完成,并且当前文件夹可以真正移动,因为没有正在运行的进程使用此文件夹或其子文件夹之一作为当前文件夹,并且没有正在运行的进程在此文件夹或其子文件夹中打开任何文件,只要防止文件被打开就可以防止文件的删除或移动进程,并且目标文件夹尚未包含相同名称的文件夹。
    然后,必须先还原先前的执行环境,然后才能处理内存中列表中的下一个文件夹名称。请阅读Variables are not behaving as expected,以获取有关命令 SETLOCAL ENDLOCAL 的详细信息,因为除了为列表中的每个文件夹名称启用和禁用延迟扩展以外,还可以做更多的事情。
    为了了解所使用的命令及其工作方式,请打开this answer窗口,在其中执行以下命令,并非常仔细地阅读针对每个命令显示的所有帮助页面。
  • %%I
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • md /?
  • move /?
  • set /?
  • setlocal /?

  • 注意:此批处理文件解决方案不适用于包含Unicode字符的文件夹。如果文件夹包含非command prompt字符,则应使用this one编写的PowerShell脚本(如mklement0)。

    关于windows - 将文件夹移动到自己的第一个字母目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65546005/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com