
У меня есть пакетный файл, который выглядит так:
set FOLDERTOZIP=c:\myfolder
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a:%%b)
set OUTPUTFILE=C:\myArchive %mydate% %mytime%.zip
echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs
CScript _zipIt.vbs %FOLDERTOZIP% %OUTPUTFILE%
Скрипт не запускается в основном из-за добавления %mydate% %mytime%
в имя файла.
Как получить имя файла с текущей датой и временем?
решение1
В вашем коде есть две проблемы. Во-первых, вы должны заключать в кавычки все пути, которые могут содержать пробелы.
CScript _zipIt.vbs "%FOLDERTOZIP%" "%OUTPUTFILE%"
Во-вторых, имя вашего zip-файла содержит ':', что не является допустимым символом для имен файлов. Вы должны это изменить.
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a-%%b)
Кроме того: почему вы смешиваете bat-файл и vbs-файл? Почему бы вам просто не использовать vbs? И во время отладки вы должны разбить строки echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
на две строки, где первая строка вызывает NameSpace
и сохраняет возвращаемый объект, а вторая строка использует объект. Конечно, для производственного кода ваша более короткая версия лучше.