批处理文件以创建文件夹并在文件夹中移动文件

时间:2018-10-11 23:59:52

标签: batch-file

我正在批量提取屏幕快照,以获取我们计划在正在使用的试管站点上使用的内容。

每个内容的jpeg文件的标签如下:

6c82c0239f6eb839-1
6c82c0239f6eb839-2
all the way to 120

每个内容的文件名不同

a82384e2c46ba4af-1
a82384e2c46ba4af-2
etc.

它们都将被提取到一个单一文件夹中。

因此,我基本上需要一个批处理文件,该文件将基于内容名称创建文件夹(不带破折号和数字),并使用内容名称移动文件夹中的所有120 jpeg。

例如:
创建名为6c82c0239f6eb839的文件夹,并
将6c82c0239f6eb839-1到6c82c0239f6eb839-120移到创建的文件夹中。

我看到了另一个带有以下批处理文件的线程。它几乎是我想要的,但是文件夹名称只有3个字符长,文件被复制到新创建的文件夹中而不是移动它们。

@echo off
SetLocal EnableDelayedExpansion
for /F "delims=" %%a in ('dir /b *.jpeg') do (
  set Name=%%a
  set Folder=!Name:~0,3!
  xcopy  /y "%%a" !Folder!\
)

有人可以更改此设置,使其显示完整的文件名,而不显示文件夹的破折号和编号,并在其各自的文件夹中移动文件而不是复制文件吗?

谢谢

3 个答案:

答案 0 :(得分:0)

如果仅尝试将正确的jpeg复制到正确的文件夹,则可以执行以下操作:

@echo off
SetLocal EnableDelayedExpansion
CD <CORRECT ROOT PATH>
for /F "delims=" %%a in ('dir /b *.jpeg') do (
  set Name=%%a
  REM I presume all the files have 16 characters before the dash
  set Folder=!Name:~0,16!
  IF NOT EXIST !Folder! MKDIR !FOLDER!
xcopy  /y "%%a" !Folder!\
)

我无法测试。

答案 1 :(得分:0)

@echo off
setlocal

@rem Get each jpeg file.
for /F "delims=" %%A in ('2^>nul dir /b *.jpeg') do (

    rem Get filename as token before the dash.
    for /f "delims=-" %%B in ("%%~A") do (

        rem Make dir if needed.
        if not exist "%%~B" md "%%~B"

        rem Check if isdir.
        2>nul pushd "%%~B" && popd

        if errorlevel 1 (
            >&2 echo Failed isdir "%%~B".
        ) else (

            rem Do the move operation.
            >nul move /y "%%~A" "%%~B"

            if errorlevel 1 (
                >&2 echo Failed move "%%~A" to "%%~B"
            )
        )
    )
)

exit /b %errorlevel%

该代码的注释很好,因此如果您想了解 通过将@echo off更改为@echo on来评估代码。 %errorlevel%之后不能使用exit /b 必填项,但会让您知道errorlevel是什么 使用@echo on时。

pushd测试目录 (即使它是一个符号链接)。 检查errorlevel以确定是否回显 错误消息或执行move

由于for循环变量是直接使用的,因此使用 不需要enabledelayedexpansion

许多命令都支持/?的参数以获取帮助 关于命令。即move /?

答案 2 :(得分:0)

首先,对于我的第一篇文章,我谨此致歉。

micheal_heath的回答解决了我的问题。

此外,我碰巧在另一个也有效的站点上由用户Salmon Trout找到了这篇文章。

Batch file to make folders with part of file name and then copy files

@echo off
setlocal enabledelayedexpansion
for %%A in (*.psd *.jpg) do (
   echo file found  %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
   for /f "tokens=1* delims=_" %%D in ("!fname!") do set folname=%%D
   echo folder name !folname!
   if not exist "!folname!" (
      echo Folder !folname! does not exist, creating
      md "!folname!"
   ) else (
      echo Folder !folname! exists
   )
   echo Moving file %%A to folder !folname!
   move "%%A" "!folname!"
   )
echo Finished
pause

我刚刚更改了以下行,删除了连字符和数字以正确创建文件名的文件夹。

for /f "tokens=1* delims=-***" %%D in ("!fname!") do set folname=%%D

我仍然不知道为什么以及如何使用这两种方法,但这对我来说是一个有趣的开始。我希望尝试解决类似问题的其他初学者可以从这篇文章中找到有用的东西。