Проверить наличие файла ЕСЛИ, Иначе скопируйте эти два файла - PullRequest
5 голосов
/ 30 мая 2020

Доброе утро.

Итак, я часами пытался сколотить множество ответов на другие сообщения в свой собственный код, чтобы посмотреть, смогу ли я получить что-нибудь пригодное для использования. Нет- go. Я достаточно потерялся в этом соусе, и теперь должен попросить вас о помощи.

Фон: ОС: Windows 10 Я использую программу text2folders.exe для создания 20-30 новых папок на вторичном диске каждую ночь. В первую очередь, у меня есть базовый файл «aGallery-dl.bat», которым я заполняю каждую папку с помощью командного файла xcopy. Во-вторых, время от времени я обновляю исходный файл «aGallery-dl.bat», используя тот же xcopy, и это перезаписывает старый целевой файл, заполняя все папки новейшим «aGallery-dl.bat» ( нужно им это или нет). Все хорошо.

@echo off
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy /y /d ".\aGallery-dl.bat" "%%a\"

Недавно я решил, что хочу добавить по два новых файла в каждую папку, и расширил свой xcopy, включив их. Все хорошо.

@echo off
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy /y /d ".\aGallery-dl.bat" "%%a\"
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder.jpg" "%%a\"
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder2.jpg" "%%a\"

Folder.jpg большой красный X

Folder2.jpg большой желтый! mark

Когда я выбираю запустить «aGallery-dl.bat» в заданной папке (опять же, одной из сотен), он сначала удаляет Folder.jpg, а затем переименовывает Folder2.jpg в Folder.jpg . В результате красный X заменяется желтым! при просмотре папки в родительской папке проводника. Во-вторых, он вызывает «gallery-dl.exe». Я использую переход от красного к желтому, чтобы сообщить мне, что я хотя бы раз запускал "aGallery-dl.bat". Все хорошо.

rem @echo off
del .\Folder.jpg
ren .\Folder2.jpg Folder.jpg
FOR /F %%i IN ('cd') DO set FOLDER=%%~nxi
"C:\Program Files (x86)\gallery-dl\gallery-dl.exe" -d "U:\11Web\gallery-dl" --download-archive ".\aGDB.sqlite3" "https://www.deviantart.com/"%FOLDER%"/gallery/all"
del .\Folder.jpg

Если "aGallery-dl.bat" завершается успешно, он, наконец, удаляет Folder.jpg (в настоящее время желтый!), А теперь репрезентативное содержимое папки (обычно DeviantArt .jpg) ) видны.

Проблема: Когда мне нужно повторно запустить мою исходную команду xcopy для обновления «aGallery-dl.bat» во ВСЕХ ПАПКАХ, Folder.jpg и Folder2.jpg будут повторно скопированы во все папки, исключая возможность их однократного удаления через "aGallery-dl.bat". Я не хочу, чтобы go возвращался и повторно запускал "aGallery-dl.bat" периодически для 100 папок (опять же, только для тех, у которых aGallery-dl.bat запускался хотя бы один раз). Мне нужен какой-то тест, который, если «aGallery-dl.bat» уже присутствует в целевой папке, НЕ xcopy Folder.jpg и Folder2.jpg, также известный как неопределенный пример, ниже.

*********************************Some sort of test statement here!!!***********************

:aGallery-dlPresent
GOTO eof

:aGallery-dlNotPresent
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder.jpg" "%%a\"
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder2.jpg" "%%a\"
GOTO eof

:eof

Я нашел обнадеживающее заявление о проверке кандидата ниже (скопировано в его исходной форме из того, что / где я читал в другом сообщении), но ищу идеи / замены, так как У меня НЕТ ИДЕИ, как изменить / внедрить / реализовать ниже, чтобы работать с указанным выше.

If exist \\%DIR%\%Folder%\123456789.wav xcopy \\%DIR%\%Folder%\123456789.wav D:\%New Folder%\ /y

XCopy копирует файл и не перезаписывает предыдущий, если он существует (без запроса)

Примечание : Ниже приведено смутное приближение того, как все это должно выглядеть (за исключением правильного оператора -test -).

rem @echo off
*********************************Some sort of test statement here!!!***********************

:aGallery-dlPresent
GOTO eof

:aGallery-dlNotPresent
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder.jpg" "%%a\"
for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy ".\Folder2.jpg" "%%a\"
GOTO eof

:eof

for /D %%a in ("U:\11Web\gallery-dl\deviantart\*.*") do xcopy /y /d ".\aGallery-dl.bat" "%%a\"

1 Ответ

5 голосов
/ 30 мая 2020

Команда для копирования файла: COPY . Это внутренняя команда Windows командного процессора cmd.exe. XCOPY - это расширенный файл и каталог, копирующий исполняемый файл в каталог %SystemRoot%\System32, который устарел с Windows Vista, так как есть еще более мощный ROBOCOPY , который с полное квалифицированное имя файла %SystemRoot%\System32\robocopy.exe.

Нет необходимости использовать XCOPY или ROBOCOPY для этой простой задачи копирования файлов. COPY достаточно для исходных файлов aGallery-dl.bat, Folder.jpg и Folder2.jpg не имеют установленного скрытого атрибута, а для тех же файлов в целевых каталогах не установлен атрибут только для чтения.

.\ ссылается на текущий каталог, который может быть любым каталогом. Windows Проводник устанавливает каталог командного файла как текущий каталог при двойном щелчке по командному файлу. Но это почти единственный метод запуска командного файла, в котором каталог исполняемого командного файла автоматически устанавливается как текущий каталог (за исключением того, что командный файл хранится на сетевом ресурсе, доступ к которому осуществляется с использованием пути UN C).

Существует %~dp0 для ссылки на путь к пакетному файлу. Этот путь всегда заканчивается backsla sh, что означает, что никакой дополнительной backsla sh не требуется для конкатенации пути к пакетному файлу с именем файла или папки. Использование %~dp0 позволяет ссылаться на файлы в том же каталоге, что и исполняемый пакетный файл, независимо от того, какой каталог является текущим каталогом при выполнении пакетного файла.

Пакетный файл, необходимый для вашей задачи:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /D %%I in ("U:\11Web\gallery-dl\deviantart\*") do (
    if not exist "%%I\aGallery-dl.bat" (
        copy "%~dp0Folder.jpg" "%%I\"
        copy "%~dp0Folder2.jpg" "%%I\"
    )
    copy /Y "%~dp0aGallery-dl.bat" "%%I\"
)
endlocal

Имя файла / папки должно быть заключено в ", если оно содержит пробел или один из этих символов &()[]{}^=;!'+,`~. По этой причине все имена файлов / папок заключены в этом командном файле в двойные кавычки, хотя внутри командных файлов ни одно имя файла / папки не содержит пробела или одного из символов в списке. При написании командного файла важно понимать, как выглядит командная строка после того, как командный процессор Windows обработал командную строку. См. Следующие разделы:

Windows интерпретирует *.* как просто *, что означает любое имя файла или папки. По этой причине достаточно просто написать * и опустить .*.

Обратите внимание, что for /D игнорирует каталоги с установленным скрытым атрибутом.

Пакетный файл сначала проверяет каждый вложенная папка, если в ней нет командного файла aGallery-dl.bat. В этом случае он копирует два файла Folder.jpg и Folder2.jpg из каталога исполняемого командного файла в текущий подкаталог U:\11Web\gallery-dl\deviantart.

Затем командный файл aGallery-dl.bat копируется из каталога исполняемого командного файла в текущий подкаталог U:\11Web\gallery-dl\deviantart независимо от его существования в целевом каталоге.

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

  • call /? ... объясняет %~dp0 ... диск и путь аргумента 0 ... полный путь к пакетному файлу.
  • cmd /? ... выводит справку Windows командного процессора, выполняющего пакетный файл.
  • copy /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • setlocal /?

См. Также главы Выпуск 6 и Проблема 7 в этот ответ зачем использовать setlocal EnableExtensions DisableDelayedExpansion и endlocal, хотя не ne cessary по умолчанию и почему используется I вместо a в качестве переменной l oop, хотя a здесь тоже будет работать.

...