【问题标题】:batch/power shell script to create folders based on file name and move files批处理/powershell脚本,用于根据文件名创建文件夹并移动文件
【发布时间】:2015-06-08 15:45:30
【问题描述】:

我有几个文件,其名称类似于“Axis_Master Group_First_Report_201312.xlsx”, Axis_Master Group_second_Report_201312.xlsx。 我需要一个脚本来读取文件名并根据文件名创建文件夹并将文件移动到该文件夹​​中。 在上面的示例中,我需要将第一个文件移动到名为 Axis 的文件夹中,并且在 Axis 中,它应该被移动到文件夹 First 中。 对于第二个文件,需要将其移至同一个 Axis 文件夹,但应将其移至新文件夹“second”。 请帮忙。 提前致谢。

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    我假设所有文件都匹配*_*_*_*.xlsx,并且您希望第一个和第三个标记使用_ 作为分隔符。

    第一个 FOR 只是迭代所有匹配的文件。随后的 FOR /F 解析出第一个和第三个标记。反复尝试多次创建文件夹永远不会有什么坏处。我只是通过将 stderr 重定向到 nul 来隐藏任何错误消息。

    @echo off
    for %%F in (*_*_*_*.xlsx) do for /f "tokens=1,3 delims=_" %%A in ("%%F") do (
      md "%%A\%%B" 2>nul
      move "%%F" "%%A\%%B"
    )
    

    【讨论】:

    • 我会将模式改进为?*_*_?*_*.xlsx 甚至?*_?*_?*_*.xlsx(和delims=_" 而不是delims=_' :))
    • 是的 - 我的 DELIMS 规范中有一个错字。谢谢。我不认为添加? 有很大的改进。我想它保证下划线之间至少有一个字符,但该字符可能是另一个下划线,这仍然会产生问题。如果您真的想获得精确的文件掩码,则将外部循环切换到 FOR /F 执行 DIR /B 使用适当的正则表达式通过管道传输到 FINDSTR。但很可能,我的原始代码适用于 OP。
    【解决方案2】:

    此代码将所有匹配模式"Axis_Master Group_$1_$2.$3" 的文件移动到文件夹axis\$1 并将其重命名为$2.$3

    @echo off
    md axis > Nul <&2
    for %%a in ("Axis_Master Group_*_*.*") do (
        call :refolder "%%a"
    )
    exit /b
    
    :refolder
    set fileName=%~n1
    set fileName=%fileName:Axis_Master Group_=%
    for /f "delims=_ tokens=1*" %%a in ("%fileName%") do (
        md axis\%%a > Nul <&2
        move /y %1 axis\%%a\%%b%~x1 > Nul <&2
    )
    exit /b
    

    【讨论】:

    • 谢谢。这有帮助。让它与这个脚本一起工作。 @echo off SETLOCAL SET "sourcedir=c:\Src" PUSHD %sourcedir% for /f "tokens=1-3 delims=_" %%i in ('dir /b /a-d _. xlsx') 做 ( mkdir "%%i" >nul mkdir "%%i/%%j" >nul mkdir "%%i/%%j/%%k" >nul move "%%i_*.xlsx" "%%i/%%j/%%k" >NUL)
    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多