Назад | Перейти на главную страницу

Скрипт для переименования файлов и добавления метки времени (server 2012 r2)

Я изо всех сил пытаюсь создать (довольно простой) сценарий пакетного файла, который удовлетворяет этим требованиям:

1 файл создается в день, поэтому его должно быть только 1, но если их больше 1 (из-за того, что скрипт не запускается по какой-либо причине), он должен иметь возможность создавать несколько файлов или просто выбрать первый и обработать его. правильно. (Я могу запланировать его запуск несколько раз в день, чтобы забрать все, что не было обработано ранее.

Итак, вот мой код. Я собрал его из Google, и он работает определенным образом, но не совсем то, что я хочу.

echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%

set stamp=%YYYY%%MM%%DD%_%HH%%Min%%Sec%

move "c:\test\source\*.csv" "c:\test\destination\File_%stamp%.csv"

Он находит файл в порядке. Он переименовывает его в желаемом мне формате (но использует текущую дату и время, не знаю, как использовать вместо этого дату изменения или создания) и перемещает его правильно. Но это работает только для одного файла. Если в каталоге есть несколько файлов, возникает ошибка, что он не может объединить несколько файлов в один (что имеет смысл, он не может переименовать все файлы в 1 файл.

Но я застрял. Я не знаю, как пойти дальше. Кто-нибудь может мне помочь? Я смутно понимаю, что делает код, но недостаточно, чтобы заставить его делать то, что я хочу.

Powershell также был бы вариантом, но я еще меньше знаю, как это сделать. Если есть другой вариант, который можно легко запланировать через планировщик задач, он тоже подойдет.

Эта часть PowerShell делает то, что вы хотите. Просто поместите полный путь к исходному и целевому каталогам вверху в кавычках.

Изменить: добавлен бит о времени создания файла. Изменить: добавлены примеры именования, # - это комментарий, оставьте только один $name = раскомментированный за один раз, если вы раскомментируете несколько, это будет последний раскомментированный, который вступит в силу.

$source = "c:\te\s"
$destination = "c:\te\d"

Get-ChildItem $source -Recurse -Include *.csv | % {
    $name = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    #$name = "Finished_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    #$name = "Finished_" + $_.Name.Split(".")[0] +  "_" + ($_.CreationTime | Get-Date -Format yyyymmdd) + "_" + ($_.CreationTime | Get-Date  -Format hhmmss) + ".csv"
    Rename-Item $_ -NewName $name
    Move-Item "$($_.Directory)\$name" -Destination $destination
}

Кроме того, я настоятельно рекомендую каждый день уделять немного времени изучению PowerShell, это действительно отличный инструмент, и он намного удобнее для пользователя, чем пакетные сценарии, поскольку языки сценариев легко читаются, в основном потому, что они написаны почти на простом языке. английский. Это хороший ресурс для ресурсов! :)