пакет - добавить либо дату / время создания или случайным образом в конец имени файла - PullRequest
1 голос
/ 17 января 2011

Девица, терпящая бедствие, нуждающаяся в помощи пакетного скрипта.

У меня есть куча файлов, которые создает одна система.Либо в одном из 2 каталогов, либо в каталоге выше этого.

Наименование, по-видимому, не очень важно, так что оно немного случайное.

2 вопроса для вас, гениальных людей.

а) Как добавить дату / время создания к концу имени файла с помощью пакетного сценария?б) Как я могу добавить случайное имя файла (чтобы я сделал файлы уникальными) с помощью пакетного сценария?

Заранее спасибо, парни и придурки.

С уважением, Макловин!1013 *

Я решил в своей мудрости не говорить о дате создания.Я понимаю, это следует за файлом в любом случае.Вместо этого я хочу добавить текущую дату / время к файлу.

Вот что у меня есть:

SetLocal EnableDelayedExpansion
set kvitt1="c:\a"
set kvitt2="c:\b"
set tmpDir="c:\temp"
set LASTMOD= 
set DATO=%DATE%
set KLOKKE=%TIME%
pause

REM lets go to this directory, and scan for files, and copy to the temp
pushd %kvitt1%

:ONE
for /f "tokens=*" %%a in ('dir /b /od 2^>NUL') do set lastmod=%%a
if "%lastmod%"=="" echo Could not locate files.&goto :TWO

COPY "%Lastmod%" %tmpDir%
pause

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

popd
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

REM Let's go to the next directory, and scan for files to copy to the temp
:TWO
REM Gå til ny nettverksstasjon
pushd %kvitt2%

for /f "tokens=*" %%a in ('dir /b /od 2^>NUL') do set lastmod=%%a
if "%lastmod%"=="" echo Could not locate files.&goto :EOF

COPY "%LASTMOD%" %tmpDir%
pause
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

popd

REM we have copied the files we need, lets skip to the temp directory for renaming and filenaming

pushd %tmpDir%
echo %tmpDir%
pause

REM this is clearly not doing much.
REM gåsetegn foran tmpDir fordi det kan finnes filer med mellomrom. dir/b lister opp filene i mappen, og lagrer det i  filelist.txt
dir /b "%tmpDir%" >>filelist.txt
pause
REM går igjennom alle linjene i fillist.txt. %%i inneholder filnavnet
pause
REM for /f %%i in (filelist.txt) do
REM (

REM This is clearly not working
for /F "tokens=2,3,4 delims=/ " %%a in ('date /t') do set filedate=%%a-%%b-%%c
ren %filedate%_"%%T" "%T" 
REM ren "%%T" %!random%"%%~nT.kvi")

pause

Ответы [ 2 ]

1 голос
/ 18 января 2011

Попробуйте это для:

ECHO Making the copy...
COPY C:\file.txt c:\file_%time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%.txt
PAUSE
CLS
EXIT

Время разбора выполняется (пропустите ECHO, если используете его в именовании файла):

ECHO %time:~0,2%%time:~3,2%%time:~6,2%_%date:~-10,2%%date:~-7,2%%date:~-4,4%

Я получил это от http://www.ozzu.com/mswindows-forum/can-batch-files-use-date-for-filename-creation-t75600.html, где есть немного больше подробностей об этом.

Что касается b, время здесь записывается с точностью до секунд, поэтому добавление времени сделает его уникальным, если вы не выполняете больше 1 в секунду.

РЕДАКТИРОВАТЬ: Это получает только текущую дату. Для пакетного переименования в дату файла попробуйте вместо этого:

for /f "delims=|" %%f in ('dir /b C:\temp') do call :runsub %%f
goto EOF

:runsub
set t=%~t1
set t=%t::=%
set t=%t: =%
set t=%t:/=%
set renameto=%~n1-%t%%~x1
Copy %1 %renameto%

:EOF
PAUSE

Вы можете изменить C: \ temp на путь, по которому вы хотите изменить файлы. Дайте мне знать, если вам нужны какие-либо изменения.

0 голосов
/ 19 января 2011

вам лучше использовать vbscript (или powershell, если у вас есть), а не пакетный.это связано с тем, что манипулирование датой в пакете зависит от региональных настроек вашего компьютера.Вам придется использовать такие хитрости, как вход в реестр и прочее в качестве обходного пути.

Вот vbscript, который вы можете адаптировать к вашим потребностям.

Set objFS = CreateObject( "Scripting.FileSystemObject" )
strFolder = WScript.Arguments(0)
Set objFolder = objFS.GetFolder(strFolder)
t = Now
strDate = Year(t) & Month(t) & Day(t) & Hour(t) & Minute(t) & Second(t)
' by random number
Randomize
upperbound = 99999
lowerbound = 55555

For Each strFile In objFolder.Files
    strExtension = objFS.GetExtensionName( strFile )
    strName = objFS.GetBaseName( strFile)   
    rand = Int((upperbound - lowerbound + 1) * Rnd + lowerbound) 'gen random number
    ' uncomment to use date
    ' strFile.Name = strName & strDate & "." & strExtension 

    ' uncomment to use random number of your choosing
    ' strFile.Name = strName & rand & "." & strExtension

Next
...