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

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 批处理文件但隐藏命令窗口?

    如何运行 Windows 批处理文件但隐藏命令窗口 我不希望 cmd exe 在执行文件时在屏幕上可见 这可能吗 如果你写一个非托管程序并使用创建进程 https learn microsoft com en us windows win3
  • 使用“for”循环迭代目录中的所有文件

    如何使用 a 迭代目录中的每个文件for loop 我如何判断某个条目是目录还是文件 这会递归地列出当前目录及其子目录中的所有文件 并且仅列出文件 for r i in do echo i 此外 如果您在批处理文件中运行该命令 则需要将 符
  • 带有 FOR 的批处理脚本不起作用

    我需要以下脚本的帮助 machine txt 的下一行不会继续 如果我把 放在 echo machine 后面 它会显示 machine txt 中的机器 因此 它可以工作 但是当 位于脚本末尾时 它不会继续 并退出 echo off se
  • 批处理文件 - 读取特定行,并将该行中的特定字符串保存为变量

    有没有办法让 for f 循环 或其他任何东西 读取特定行 这是我到目前为止的代码 它读取每一行的第一个单词 echo off set file readtest txt for f tokens 1 delims A in file do
  • 如何通过批处理脚本检查进程是否正在运行

    如何检查应用程序是否正在从批处理 以及 cmd 文件运行 如果程序已经在运行 我不需要启动另一个实例 我无法更改应用程序以使其仅作为单个实例 该应用程序还可以以任何用户身份运行 我想到的另一种可能性 不需要保存文件 灵感来自于使用grep
  • 批处理 - 将 dir 命令的输出存储到变量 - 目录列表中

    我需要将整个目录列表存储到一个变量中 然后将所述变量作为参数传递给另一个脚本 直接或首先将 dir 的输出存储到文本文件中 然后执行如下操作 dir path todir gt temp txt set p VAR
  • Mercurial/extdiff 没有更改为临时目录(正如我认为应该的那样)

    使用 Windows Mercurial 和 extdiff 扩展 适用于 Mercurial 我试图设置 extdiff 以使用 WinDiff 作为外部比较工具 但我认为我已经将问题范围缩小到足以说明问题在我还没有做到这一点之前 根据我
  • 批量双延迟扩容?

    如果有意义的话 我正在尝试将延迟的扩张加倍 这就是我想要的 set var1 hello set var2 var1 set var3 var2 echo var3 然后有hello被显示 这不是我的实际代码 而是我需要它如何工作的示例 甚
  • 如何从 Windows 批处理文件中的 ECHO 字符串中去除引号?

    我正在创建一个 Windows 批处理文件 但我必须 ECHO 一个大型复杂字符串 因此我必须在两端加上双引号 问题是引号也被回显到我正在写入的文件中 如何 ECHO 这样的字符串并去掉引号 UPDATE 我花了两天的时间研究这个问题 终于
  • Windows Batch 帮助从命令输出设置变量[重复]

    这个问题在这里已经有答案了 我需要运行一个简单的 find 命令并将输出重定向到 Windows 批处理文件中的变量 我已经尝试过这个 set file ls find txt echo file 但这不起作用 如果我运行此命令 它可以正常
  • DOS批处理文件for循环中的变量赋值问题

    我在 DOS 脚本 for 循环中遇到变量赋值问题 它从不分配值 它总是空白 下面是示例代码 echo off set ans 1 SET STRING ans echo Parsing the string STRING for f to
  • 如何获取%CD%的父路径

    如何获取当前 CD 的父路径 例如 ECHO CD result C Windows System32 这不起作用 ECHO CD 期望的结果 C Windows 尝试更改当前目录 然后使用 cd pushd echo cd popd
  • 批处理文件无法在条件语句中设置环境变量

    为什么 Windows 批处理文件输出以下内容Foo其次是Bar 而不是Baz echo off setlocal set Foo echo set Bar if 1 1 set Baz echo 我的系统 Microsoft Window
  • 如何使用Windows批处理命令删除“无扩展名的文件”的所有内容

    我想删除以 FIlE 为扩展名的文件的内容 即没有扩展名 我知道如何删除文本文件的内容 但不知道如何删除以 文件 为扩展名的文件 我会感谢你的努力 提前致谢 Use Del 在批处理文件中删除没有扩展名的文件 use Dir A D 列出所
  • 如何通过 DOS 批处理命令发送电子邮件?

    我在 DOS 中有一个批处理文件 可以进行一些检查 完成后我需要发送一封电子邮件 我在 interwebz 上找到了一些解决方案 但大多数都是第三方的 或者只是在 Outlook 中打开新邮件 我需要命令来发送完整的电子邮件 而无需任何人工
  • 排除批复制脚本中的文件夹

    我正在使用 U 盘上的批处理文件来备份我的照片 我使用以下命令 for r C x in jpg png gif do copy y x 我想排除邮件文件夹 WINDOWS 和 PROGRAM FILES 中的文件 有谁知道如何使用批处理文
  • 使用 .bat 通过文件资源管理器打开文件夹

    我应该使用什么命令在程序末尾打开指定路径 start c Yaya yoyo 不管用 你可以这样尝试 SystemRoot explorer exe c Yaya yoyo
  • 如何在批处理文件中回显换行符?

    如何从批处理文件输出中插入换行符 我想做类似的事情 echo hello nworld 这会输出 hello world Use echo hello echo echo world
  • 使用批处理文件创建 exe 的快捷方式

    我知道这样的主题已经存在 但我不想使用 VB 脚本 我希望你能在 DOS 中使用命令行创建快捷方式 请发布一些很棒的例子 Thanks AA 如果不调用外部程序 则无法在 bat 文件中创建快捷方式 然而 自 Win2k 以来的每个版本的
  • 通过批处理文件自动化 cygwin

    长话短说 我们有多个服务器 我们每晚都在其上运行 perflog 监控 我的工作是将这些日志转换为 csv 格式并将它们发送到我的电子邮件 这一点已经通过前员工编写的 sh 脚本实现了自动化 我想要自动化的是在 perfmon 日志记录之后

随机推荐