Показать полную графическую версию : [решено] Очищение папки TEMP
if exist "%sTempFolder%\." »
В некоторых случаях, это не очень хорошая идея, использовать точку для проверки существования каталога ...
Поясню картинкой:
https://jpegshare.net/thumbs/bf/3a/bf3a3662576c777ec9a3d21a41790ddb.jpg (https://jpegshare.net/bf/3a/bf3a3662576c777ec9a3d21a41790ddb.png.html)
Названия соответствуют существующим элементам, т.е. "file" - файл, "FOLDER" - каталог
neviDimka91
07-03-2019, 09:02
Их можно грохать все, но только после завершения загрузки »
ко времени запуска скрипта, загрузка ОС завершена и все обновления так же установлены.
Причём даже на этом этапе некоторые файлы из этой папки могут использоваться системой — и тогда она их удалить не даст »
да, данный скрипт, что написал я в последнем своем сообщение, не полностью очищает папку, скорее всего какие то файлы используются в данный момент.
Ключевые, с моей точки зрения, места в коде выделил. »
в написании скриптов не силен (от слова совсем) буду изучать и разбирать команды cmd и ваш код, особенно выделенные места. Как я на данную минуту понял, если папка %sTempFolder%\ существует , то переходим в каталог и очищаем содержимое с ключами s и q, а если каталога нет то выход.
YuS_2, антересно девки пляшуть, по четыре штуки в ряд. Хмм… Я был уверен, что именно наличие точки гарантирует, что это будет каталог. У Вас есть идеи — отчего так?!
то переходим в каталог и очищаем содержимое »
Переходим и, если удачно перешли, тогда пытаемся удалить этот каталог (что приводит к удалению всего его содержимого, кроме самого каталога, поскольку он является в этот момент текущим).
У Вас есть идеи — отчего так?! »
Видимо, какой-то скрытый баг интерпретатора, потому как путь такой, на самом деле ведь не существует и при попытке перейти по нему, будет выдано сообщение об ошибке...
Хмм… Я был уверен, что именно наличие точки гарантирует, что это будет каталог. У Вас есть идеи — отчего так?! »
да, несколько неожиданно, хотя в чём-то даже логично: точка - скорее оператор(?) контекста, чем относительный путь
Видимо, какой-то скрытый баг интерпретатора, потому как путь такой, на самом деле ведь не существует и при попытке перейти по нему, будет выдано сообщение об ошибке... »
на файл тоже нельзя перейти, так что не аргумент
даже на этом этапе некоторые файлы из этой папки могут использоваться системой — и тогда она их удалить не даст.»
логично предположить, что если если одни файлы уже используются системой, то некоторые соседние могут понадобиться чуть позже
Видимо, какой-то скрытый баг интерпретатора, потому как путь такой, на самом деле ведь не существует и при попытке перейти по нему, будет выдано сообщение об ошибке... »
да, несколько неожиданно, хотя в чём-то даже логично: точка - скорее оператор(?) контекста, чем относительный путь »
Похоже, проблема несколько глубже, нежели чем просто в отдельно взятом интерпретаторе команд: то же самое наблюдается в WSH, PowerShell, .Net. Возможно, дело в функции WinAPI, но мне что-то лень ковырять :).
Надо просто запомнить и больше не использовать данную логику в пакетных файлах (в остальных языках есть нормальное деление на File Exists/Folder Exists).
хотя в чём-то даже логично »
Не очень. Точка -оператор текущего каталога, но там его просто не существует, т.к. это файл.
на файл тоже нельзя перейти, так что не аргумент »
Как раз, аргумент присутствия бага, вопрос только в том, где он закопался...
На файл условный оператор указывает правильно:
if exist "d:\FOLDER\file\" (echo Yes) else (echo No)
No
- такого каталога не существует. И перейти соответственно нельзя.
А если без слэша, то файл будет найден, хоть и перейти нельзя - тут всё верно и условный оператор отрабатывает соответственно тому, о чем его попросили.
И кстати, вот это тоже верно, с точки зрения синтаксиса и логики тоже:
if exist "d:\FOLDER\file\.." (echo Yes) else (echo No)
Yes
две точки - переход в родительский каталог. Он существует, значит условие выполнено.
А вот это вне логики:
if exist "d:\FOLDER\file\." (echo Yes) else (echo No)
Yes
- никакого разумного объяснения, лично я, не нашел...
В некоторых случаях, это не очень хорошая идея, использовать точку для проверки существования каталога ... »
а так?
@echo off
echo "%~a1"|>nul find "d" && echo Folder || echo File
pause
а так? »
Да, так нормально, но тут необходимо быть уверенным, что параметром будет действительное имя файла или каталога, потому, что прилететь может простой набор букв и такой код выдаст, что это имя файла...
В общем, понадобится двойная проверка, ещё и как минимум, на наличие дефиса "-", чтобы однозначно определить, что это существующий путь к файлу или каталогу.
понадобится двойная проверка »
ну для студентов разных может быть, а для того кто делом занимается, достаточно, так как уж он точно знает и понимает что задает параметром, тем более можно и так поступить:
@echo off
for /f "delims=" %%a in ('dir /b "Имя или часть*"') do echo "%%~aa"|>nul find "d" && echo Folder || echo File
pause& exit
тут левый набор не прокатит, так как будет ошибка просто - файл не найден.
Disk Cleanup удаляет оттуда только те файлы, разница в дате-времени последней модификации которых с текущей датой составляет свыше семи дней. »
я бы чтонить такое намутил...
robocopy /e /xj /minage:7 /mov /r:0 /w:0 %temp% %temp%\_old_ /xd _old_
rd /s /q %temp%\_old_
neviDimka91
24-04-2019, 11:15
Раз уж тут так много знающих людей по работе и написанию скриптов , могу я вас попросить о помощи. Есть тот же сервер, к которому по RDP подключаются пользователи. На этом сервере, по пути C:\User\ лежат их папки с профилями. Так вот у каждого в этом профиле есть папочка, а именно путь к ней такой C:\Users\username\AppData\Roaming\1C\1CEStart в этой папке лежит файлик 1CEStart.cfg. Периодически мы изменяем этот файлик и его нужно распространить всем пользователям, как бы заменить. Как при помощи скрипта это сделать?
так, если есть имена под рукой
@echo off
set "in=D:\Papka\1CEStart.cfg"
for %%d in ("Петя" "Вася" "Yulya 9") do copy /y "%in%" "C:\Users\%%~d\AppData\Roaming\1C\1CEStart"
pause
или так
@echo off
set "in=D:\Papka\1CEStart.cfg"
for /f "skip=2 tokens=2,4*" %%a in ('qwinsta') do set "s=%%c"& call :# "%%a" "%%b"
pause& exit
:#
if defined s (set "name=%~1 %~2") else (set "name=%~1")
copy /y "%in%" "C:\Users\%name%\AppData\Roaming\1C\1CEStart"
exit /b
neviDimka91, домен есть, эти пользователи доменные?
neviDimka91
25-04-2019, 08:37
neviDimka91, домен есть, эти пользователи доменные? »
да, я пробовал через ГПО делать, но файлик не создается и не заменяется в данной папке, я так и не понял, почему это не происходит
по поводу кода, что постом выше, надо будет попробовать, спасибо
лежит файлик 1CEStart.cfg. Периодически мы изменяем этот файлик и его нужно распространить всем пользователям »
нужно один раз в нём прописать ссылку на общий конфиг на сетевом ресурсе, и не изобретать велосипед по замене файлов
и вообще- это офтопик, неужели непонятно, что вопрос к теме не относится
neviDimka91
26-04-2019, 10:32
нужно один раз в нём прописать ссылку на общий конфиг на сетевом ресурсе, и не изобретать велосипед по замене файлов »
в этом файле прописаны путь к базам, например:
CommonInfoBases=\\srv-fs-ip\allbase$\sta_do.v8i
и таких путей в этом файле 22. Соответственно, когда появляется новая база, создается файлик с расширением .v8i и в файле 1CEStart.cfg прописываем данный путь к этому файлу.
Потом когда какому то пользователю необходимо подключить данную базу, я на домене вношу его в специальную группу доступа и база подключается автоматически. И что бы это отработало на 100%, необходимо в его профиле на сервере заменить файл 1CEStart.cfg на новый (где новая база)
neviDimka91, вот и пропишите в общем сетевом common.cfg свои 22 пути
а в локальном только
CommonCfgLocation=\\srv-fs-ip\allbase$\common.cfg
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.