如何根据文件名的第一部分和第二部分创建文件夹并将文件移动到该文件夹​​中?

2024-02-21

我创建了以下批处理脚本来根据今天的日期创建一个文件夹,然后根据文件名将文件分组到文件夹中。

例如文件

JIM_BRICKMAN_QPS.avi
JIM_BRICKMAN_Slice.avi
JIM_BRICKMAN_Slice.jpg

被移动到文件夹BRICKMAN.

这工作正常,但是,尝试修改批处理文件以将新创建​​的文件夹移动到新创建的日期文件夹中失败或在循环时覆盖文件夹。

for /F "tokens=1-4 delims=/" %%A in ('date /t') do (
    set DateDay=%%A
    set DateMonth=%%B
    set DateYear=%%C
)
set CurrentDate=%DateDay%-%DateMonth%-%DateYear%
if not exist "%CurrentDate%" md %CurrentDate%

for %%A in (*.avi *.jpg) do (
    for /f "tokens=1,* delims=_" %%D in ("%%~nA") do (
        md "%%D" 2>nul
        echo Moving file %%A to folder %%D
        move "%%A" "%%D" >nul
    )
)

echo Finished

此外,我似乎无法让令牌忽略第一个分隔符,以便该文件夹的标题JIM_BRICKMAN不仅仅是BRICKMAN.

EDIT:

我根据评论中的建议重写了批处理文件:

set "CurrentDate=%DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%"
if not exist "%CurrentDate%" md %CurrentDate%
for %%A in (*.avi *.jpg) do (
    for /f "tokens=1,2 delims=_" %%D_%%E in ("%%~nA") do (
        md "%%D_%%E" 2>nul
        move "%%A" "%%D_%%E" >nul
    )
)

但剧本似乎失败了。我试图捕获错误,但尽管我输入了错误,它还是关闭了PAUSE在脚本中。


在开发中双击批处理文件并不是一个好主意,因为这会导致启动

%SystemRoot%\System32\cmd.exe /c "batch file name with full path and extension"

因为它可以在运行时读取cmd /?在命令提示符窗口中,该选项/C means close命令进程及其控制台窗口在命令、可执行文件或脚本执行完成后立即完成,与结束执行的原因无关。

为了在开发中调试批处理文件,最好

  1. 打开命令提示符窗口,
  2. 使用命令更改当前目录CD到批处理文件的目录和
  3. run the batch file by typing its name and hitting key RETURN or ENTER.

对于应独立于当前目录所在目录工作的批处理文件,建议忽略第 2 点并运行批处理文件,输入其完整路径、文件名和文件扩展名(用双引号引起来),并且当前目录不是所在目录批处理文件。

从命令提示符窗口中执行批处理文件:

%SystemRoot%\System32\cmd.exe /K BatchFileNameAsTyped

选项/K means keep命令进程正在运行,这导致在执行命令/可执行文件/脚本后命令提示符窗口保持打开状态,从而可以读取错误消息。

The keys UP ARROW and DOWN ARROW can be used to reload command lines once entered in command prompt window making it easy to run the batch file once again after making a modification in GUI text editor.

并且随着有@echo off从批处理文件的第一行中删除,或更改为@echo ON,或者用命令注释掉这一行REM或与::(无效标签)开始时,还可以查看Windows命令解释器在应用立即环境变量扩展后真正执行的行以及在语法错误的情况下发生错误的位置。


第二批代码错误的是以下行:

for /f "tokens=1,2 delims=_" %%D_%%E in ("%%~nA") do (

指定为循环变量必须始终为 1 个字符。正确的是:

for /f "tokens=1,2 delims=_" %%D in ("%%~nA") do (

命令echo %DATE%今天在我的计算机上输出我的帐户和区域设置的日期01.04.2017.

命令echo %DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%输出01-04-2017.

所以这部分脚本有效。

Hint:格式的目录列表YYYY-MM-DD比格式更好DD-MM-YYYY。具有格式的目录列表YYYY-MM-DD默认情况下会自动按字母顺序排序,此日期格式也会从最旧到最新排序。日期格式DD-MM-YYYY默认情况下,会产生一个奇怪的按字母顺序排序的目录列表。


此任务的批处理文件可以是:

@echo off
set "CurrentDate=%DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%"
for %%A in (*.avi *.jpg) do (
    for /F "tokens=1,2 delims=_" %%D in ("%%~nA") do (
        if not "%%E" == "" (
            md "%CurrentDate%\%%D_%%E" 2>nul
            move /Y "%%A" "%CurrentDate%\%%D_%%E\"
        ) else (
            md "%CurrentDate%\%%D" 2>nul
            move /Y "%%A" "%CurrentDate%\%%D\"
        )
    )
)
set "CurrentDate="

对于这个任务来说,内循环的工作原理是最有趣的。

for /F and "%%~nA"意思是命令FOR应该只处理 *.avi 或 *.jpg 文件的文件名,没有外部找到的文件扩展名FOR loop.

delims=_意味着FOR命令应使用下划线作为分隔符将字符串分成多个部分(标记)。第一个文件名是JIM_BRICKMAN_QPS这将分为:

  1. JIM分配给循环变量D被指定在FOR命令行,
  2. BRICKMAN分配给循环变量E这是中的下一个字符ASCII 表 http://www.asciitable.com/ after D and
  3. QPS分配给循环变量F.

此字符串分割功能是循环变量解释为区分大小写而环境变量解释为不区分大小写的原因。

With tokens=1,2指定仅对第一和第二字符串部分感兴趣。如此内在FOR在确定前两个下划线分隔字符串并将它们分配给循环变量后可以停止字符串拆分D and E.

FOR如果可以确定至少 1 个由下划线分隔的字符串,则执行命令块。所以循环变量有可能D有一个字符串值,但循环变量E是一个空字符串,例如,如果文件名不包含任何下划线。这就是原因IF健康)状况。

命令MD默认情况下,在启用命令扩展的情况下创建整个目录树。因此,在搜索 *.avi 和 *.jpg 文件之前,无需显式创建日期子目录。这很好,因为当当前目录中没有 *.avi 和 *.jpg 文件时,它可以避免创建空日期目录。

由于当前目录中的 *.avi 和 *.jpg 文件应移动到DD-MM-YYYY\Token1_Token2当然,在创建目录和移动文件时还需要使用今天的日期字符串指定环境变量。

输出的错误信息为MD如果目录存在(或者由于缺少权限而无法创建目录时)来处理STDERR被重定向为2>nul到设备NUL来压制它。

The MOVE命令与选项一起使用/Y将文件移动到目标文件夹,即使当前文件已存在于目标文件夹中。

为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • for /?
  • if /?
  • md /?
  • move /?
  • set /?

另请阅读 Microsoft 的文章:使用命令重定向运算符 https://technet.microsoft.com/en-us/library/bb490982.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据文件名的第一部分和第二部分创建文件夹并将文件移动到该文件夹​​中? 的相关文章

  • 在 Windows 系统上移动文件的最快方法 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要将大约 800GB 的数据从 NTFS 存储设备移动到 FAT32 设备 两者都是外部硬盘驱动器 在 Windows 系统上 实现这
  • 如何删除所有超过 2 天的空文件夹?

    我制作了一个脚本 删除路径中带有子文件夹的所有空文件夹 现在我必须做的是 如果一个文件夹是 2 天前创建的 并且它是空的 则应该将其与其他早于 2 天的空文件夹一起删除 如果不是 则不应删除它 我还需要 想要将已删除的文件夹写入日志中 我用
  • 使用单个字符串查找多个文件路径

    我尝试编写一个批处理脚本来查找与输入字符串同名的文件的所有路径 现在它只能找到找到的第一个文件 我想不出一种方法让它列出多个文件位置 我经验不足 需要一些帮助 这是脚本代码的一部分 start cls echo Enter file nam
  • 如何理解批处理文件?

    我之前没有使用批处理文件或 shell 脚本的经验 我需要了解相关项目中使用的批处理文件所执行的操作 有没有资源提供批处理文件命令的详尽列表以及每个命令的作用 一旦您熟悉了一般的 BAT 文件信息 使用其他用户在其他答案中发布的一些有用信息
  • 批处理文件中的 URL 解码

    如何在批处理文件中 urldecode 以下字符串 我需要更改以下内容 http x3a x2f x2f www example com x2f some page x2f some x2f link html to this http w
  • 每次批量从选择中获取随机句子

    有没有一种方法可以做到这一点 而不是每次都设置相同的回显 您可以给出一个回显列表 并且每次到达该回显命令时它都会选择一个随机的回显 是的 这是一个概念证明 echo off setlocal enabledelayedexpansion s
  • 如何将批处理变量设置为另一个脚本的输出

    我尝试将批处理变量设置为另一个命令的输出 在 Linux Unix 中 您可以简单地使用反引号 例如 在 csh 中 set MY VAR tail etc passwd windows 批处理中有类似的东西吗 实际上我已经发现了一些东西
  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • Windows批处理文件:在for循环中设置变量

    我有许多具有相同命名方案的文件 作为示例 四个文件分别称为 num 001 001 txt num 002 001 txt num 002 002 txt num 002 003 txt 第一组数字代表它来自哪个 包 第二组数字只是用来区分
  • Windows批量编程中读取文件名

    我想在Windows批处理编程中读取文件的名称 我尝试使用不同的方法但失败了请帮助 下面给出了场景 我的文件夹中有不同的文件 但所有文件的文件名长度相同 例如 1000342578 30062011 PDF 1000342329 30062
  • 批处理文件中的 %* 是什么意思?

    我见过的用法 在批处理文件和命令行中 有人可以解释一下的典型用法吗 有一个例子吗 它的意思是 命令行中的所有参数 例如 当您想要将命令行从批处理文件转发到另一个程序时 它非常有用 REM mybatchfile cmd echo You c
  • 用于从多个目录复制和重命名文件的批处理文件

    我之前曾寻找过我的问题的答案 但到目前为止还没有具体的答案 看 使用xcopy将多个目录中的文件复制到一个目录 https stackoverflow com questions 585091 using xcopy to copy fil
  • 批量设置变量=%变量:~1%是什么意思

    谁能解释一下是什么 1 在批处理文件中的以下语句中 我分配的值 variable到服务器名称并尝试过echo variable 我得到与输出相同的服务器名称 谁能解释一下下面的语句是如何工作的 set variable variable 1
  • 在批处理脚本中发送 Windows 密钥

    我最近一直在使用SendKeys使用批处理脚本的函数 我已经了解如何在窗口中输入某些键 例如 Tab 键 SendKeys TAB 或者退格键 SendKeys BACKSPACE 但我一直尝试在不按Windows键的情况下输入它 不幸的是
  • (此时出乎意料 - 批处理脚本

    我正在使用下面的批处理脚本并收到错误 这时候是出乎意料的 我知道问题出在第一行 但我不明白出了什么问题 有任何想法吗 script IF 1 LOOP1 SET P isDefault Value Missing do you want t
  • 需要帮助通过批处理文件添加注册表项

    我正在尝试通过cmd添加以下注册表项 我无法让其他用户能够使用以下命令添加此注册表项regedit exe s Location Project reg HKEY CURRENT USER Software Autodesk Fabrica
  • 有没有办法回显所有驱动器/分区的列表,例如 C:\ D:\ E:\ 等并提示用户选择其中一个来执行某些功能?

    我想知道是否有一种方法可以检查并回显 PC 上所有可用驱动器 分区的列表 并提示用户通过输入字母并按 Enter 提交来选择其中一个 然后批处理文件将继续 理想的结果可能是怎样的 echo off echo List all drives
  • BATCH - 从 Windows 命令行获取显示分辨率并设置变量

    echo off set h wmic desktopmonitor get screenheight set w wmic desktopmonitor get screenwidth echo h echo w pause 而不是得到
  • 使用批处理解析 XML 文件以从某些特定节点获取值

    对于每个节点列表有Lists作为其父节点 我想获取 保存前三个节点的变量值 即entry output and token 我知道如何使用 vbscript 来做到这一点 但对我来说 批量解决方案更有趣 请问可以做吗
  • 如何成功地用 XML 中的批处理替换文本

    我尝试使用批处理在 XML 页面中替换字符串 但无法成功完全替换它 我有这个批处理代码 echo off setlocal EnableDelayedExpansion set search logLevel 3 set replace l

随机推荐