Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何根据日期和父文件夹对图像进行排序?_Sorting_Batch File_Vbscript_Cmd_Backup - Fatal编程技术网

Sorting 如何根据日期和父文件夹对图像进行排序?

Sorting 如何根据日期和父文件夹对图像进行排序?,sorting,batch-file,vbscript,cmd,backup,Sorting,Batch File,Vbscript,Cmd,Backup,我的任务是创建每月一次的照片备份,这些照片需要从原来的位置移动到其他地方,按日期排序到文件夹中,然后按月批量刻录到磁盘。 理论上,这应该很简单,即使这是一个新的过程,我们有大约一年的照片,一旦完成,我们可以从现在开始每个月运行它 所以首先想到的是: 从位置“A”复制到位置“B”,根据创建日期“月\年”排序到子文件夹,将每个文件夹刻录到磁盘 这很简单,如果是这样的话,现在就可以做到了,我的问题是: 所有照片都来自我们提供服务的其他公司,共有15家公司,每个公司都有自己的文件夹。每个文件夹中还有5个

我的任务是创建每月一次的照片备份,这些照片需要从原来的位置移动到其他地方,按日期排序到文件夹中,然后按月批量刻录到磁盘。
理论上,这应该很简单,即使这是一个新的过程,我们有大约一年的照片,一旦完成,我们可以从现在开始每个月运行它

所以首先想到的是:
从位置“A”复制到位置“B”,根据创建日期“月\年”排序到子文件夹,将每个文件夹刻录到磁盘

这很简单,如果是这样的话,现在就可以做到了,我的问题是:
所有照片都来自我们提供服务的其他公司,共有15家公司,每个公司都有自己的文件夹。每个文件夹中还有5个文件夹,其中一个有图像,其他的有配置文件、数据库备份等

例如,结构如下:

─数据
├─公司1
│ ├───图像
│ ├───其他1
│ └───其他2
├─公司2
│ ├───图像
│ ├───其他1
│ └───其他2
└─公司3
├───图像
├───其他1
└───其他2

因此,在每个“图像”文件夹中都有不按日期排序的照片。我只需要将这些文件夹复制到如下结构:

──备份
├─01-15
│ ├───公司1
│ ├───公司2
│ └───公司3
├─02-15
│ ├───公司1
│ ├───公司2
│ └───公司3
└─03-15
├───公司1
├───公司2
└───公司3

这样,我可以简单地将每个月的文件夹刻录到自己的磁盘上,所有的图像都按公司排序

因此,创建一个名为“MONTH-YEAR”的文件夹,然后在其中为每个公司“Company1”、“Company2”等创建文件夹,然后在每个文件夹中都有该公司和该月的照片

我曾尝试批量编写此文档,几乎成功了0次。虽然我不再有代码(在它不工作了几次之后恼怒地删除了它:/),但它使用了大量嵌套的IF语句和变量来设置以维护父文件夹的父文件夹的名称等,然后循环在下一个文件夹上执行整个过程

长话短说,我需要一些方法来根据日期和上面两级文件夹的名称将图像移动到文件夹中。另外,如果它能够创建将其复制到其中的文件夹,那将非常棒。
即使有人能提供一些批量(或VBS)的起始点,或者一些我可以使用的psuedo代码,我也会非常感激

非常感谢,

这个糊涂的新手

那么,与其用图像的祖父母文件夹来刮取公司名称,不如用“数据”的子文件夹来刮取公司名称?这可以通过子程序中的一些来完成

for
循环中,
%%~tX
具有每个文件的上次修改日期。使用两个嵌套的
for
循环按空格分割该字符串,然后按斜杠分割,可以非常轻松地将日期转换为
MM-YYYY
Edit:I适用于新西兰地区,我想我已经正确配置了脚本,可以为您逐月逐年地搜索。试一试,看看它是如何工作的。(如果我试图使此区域设置不可知,我可能会为每个文件查询
wmic datafile
,但这会有点麻烦。如果需要,请告诉我。)

@echo关闭
延迟扩展
设置“source=c:\Data”
设置“目标=d:\Backup”
::对于%source%中的每个递归图像文件
对于(*.jpg*.png*.gif*.bmp*.xcf*.psd)中的/r“%source%”%%I,请执行以下操作(
rem::从“数据”中的目录1级别获取公司名称
呼叫:getCompany公司“%%~dpI”
rem::从文件上次修改日期开始获取月份-年份
rem::注意:假设~t的格式为dd/mm/yy hh:mm
对于('echo%%~tI')中的/f%%a,请执行以下操作(
对于('echo%%a')中的/f“令牌=2,3 delims=/”%%x(
设置“fdate=%%x-%%y”
)
)
设置“文件夹=%destination%\!fdate!\!company!\”
如果不存在“!folder!”md“!folder!”
NUL复制“%%~fI”!文件夹
回音完毕。
)
后藤:EOF
:getCompany
setlocal
设置“公司=%~2”
设置“公司=%company:*数据\=%”
设置公司=%company:\=&rem.%
endlocal&设置“%~1=%company%”

这些解决方案假定目录列表将文件时间戳显示为“MM/DD/YYYY HH:MM:SS PM”。如果您所在地区的时间戳格式不同,则必须修改代码

我强烈建议您使用YYYY-MM格式命名日期文件夹,以便它们按时间顺序排序。此外,你不应该使用两位数的年份——我经历过Y2K噩梦——这不值得

如果日期来自每个文件的上次修改日期,那么就相当容易了~t修饰符提供了文件的上次修改日期:

%=迭代公司文件夹=%
对于/d%%d in(“数据\*”)执行(
%=迭代公司文件夹下的图像=%
对于(“%D\IMAGES\*”)中的%%F,请执行以下操作(
%=分析文件上次修改的月份和年份=%
对于(“%%~tF”)中的/f“delims=/tokens=1,3”%%%A(
%=创建目标文件夹-忽略已存在的错误=%
md“备份\%%B-%%A\%%~nxD”2>nul
%=移动文件=%
移动“%%F”备份\%%B-%%A\%%~nxD”>nul
)
)
)
如果您想要的是创建日期,那么它就有点复杂了。我使用DIR/TC选项来获取创建日期,并且必须从DIR列表中解析日期和文件名

%=迭代公司文件夹=%
对于
@echo off
setlocal enabledelayedexpansion

set "source=c:\Data"
set "destination=d:\Backup"

:: for every image file recursively in %source%
for /r "%source%" %%I in (*.jpg *.png *.gif *.bmp *.xcf *.psd) do (

    rem :: get company name from directory 1 level within "Data"
    call :getCompany company "%%~dpI"

    rem :: get month-year from file last modified date
    rem :: note: assumes ~t is in format of dd/mm/yy hh:mm
    for /f %%a in ('echo %%~tI') do (
        for /f "tokens=2,3 delims=/" %%x in ('echo %%a') do (
            set "fdate=%%x-%%y"
        )
    )

    set "folder=%destination%\!fdate!\!company!\"
    if not exist "!folder!" md "!folder!"

    <NUL set /P "=Copying %%~nxI to !fdate!\!company!\... "
    >NUL copy "%%~fI" "!folder!"
    echo Done.
)

goto :EOF

:getCompany <var_to_set> <path>
setlocal
set "company=%~2"
set "company=%company:*Data\=%"
set company=%company:\=&rem.%
endlocal & set "%~1=%company%"