通过批处理脚本移动文件

时间:2019-02-18 06:49:35

标签: batch-file cmd

我正在尝试将文件移动到与文件名相同的目录(不包括扩展名),并在目录名的末尾添加单词footage

例如:

文件Graduation 2014.mkv应移至文件夹Graduation 2014 Footage 文件Graduation 2015.mkv应移至文件夹Graduation 2015 Footage

这是我尝试过的:

@echo off
 for %%A in (*.mkv) do (
   move "%%A" "%%~nA:~0,-8"
 )
 pause`

我收到以下错误:

  

文件名,目录名或卷标语法不正确。*

3 个答案:

答案 0 :(得分:1)

我仅根据您问题中的这一行发布此答案。

  

尝试将文件(.mkv)移动到名称相同的文件夹中,但后8个字符除外。

我相信您应该只是这样做,然后让脚本为您创建文件夹:

@echo off
for %%i in (*.mkv) do (
   mkdir "%%~ni Footage">nul 2>&1
   move "%%i"  "%%~ni Footage"
)
pause

或者如果您坚持不让脚本创建文件夹,只需执行以下操作:

@for %%i in (*.mkv) do @move "%%i"  "%%~ni Footage"

答案 1 :(得分:1)

这个简单的解决方案对我有用。

以下是文件夹名称的示例:

File1_ext
12345_5678
43226343_12
224356434
File2_ext
File3_ext
Folder_exc
File4_ext
Ect-Hello

输出树:

C:.
│   Move.bat
│
├───12345_5678
├───224356434
├───43226343_12
├───Ect-Hello
├───File1_ext
│       File1.mkv
│
├───File2_ext
│       File2.mkv
│
├───File3_ext
│       File3.mkv
│
├───File4_ext
│       File4.mkv
│
└───Folder_exc

批处理脚本:

@echo off
@setlocal enabledelayedexpansion
Rem | Get File Name
FOR %%A IN (*.mkv) do (
    Set "FileExt=%%~xA"
    Set "FileName=%%~nA"

    Rem | Get Folder Name
    for /f "tokens=*" %%B in ('dir /b /a:d^| find /i "!FileName!"') do (

        Move "!FileName!!FileExt!" "%~dp0%%B"
    )
)
pause

答案 2 :(得分:0)

我建议以与其他人稍有不同的方式来做到这一点。 Gerhard Barnard和John Kens建议对所有for文件进行简单的*.mkv循环。但是,如果有隐藏文件,这将不起作用。您可能有另一种非常通用的解决方案:

@echo off

for /F "delims=" %%A IN ('dir /b /a-d "C:\some\path\to\mkvs" *.mkv') do (
    attrib -h "%%~fA" >nul 2>&1
    if not exist "%%~dpnA Footage\" md "%%~dpnA"
    move "%%~fA" "%%~dpnA Footage\"
)

由于我们使用完整路径,因此这肯定更安全。 if exist在这里可能毫无意义,因为您可以这样做:

@echo off

for /F "delims=" %%A IN ('dir /b /a-d "C:\some\path\to\mkvs" *.mkv') do (
    attrib -h "%%~fA" >nul 2>&1
    md "%%~dpnA" >nul 2>&1
    move "%%~fA" "%%~dpnA Footage\"
)

这意味着将所有输出(错误和STDOUT)重定向到nul,因此将其隐藏。