Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
vavun
9927 / 5285 / 813
Регистрация: 07.04.2013
Сообщений: 15,336
1

Оптимизировать выполнение последовательных операций с файлами

09.09.2015, 13:14. Просмотров 1002. Ответов 13
Метки нет (Все метки)

Приветствую !

Есть набросок следующего вида:


Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
 
call :OPERATION
>nul pause
exit 0
 
:OPERATION
<nul set /p strTemp="Масло пошло   "
 
for %%A in (D:\Dir1 D:\Dir2) do (
   for %%A in ("%%~A"\*) do (
      takeown /A /F "%%~A" 2>nul 1>&2
      icacls "%%~A" /Q /C /grant "Администраторы:(F)" 2>nul 1>&2
   )
)
call :ECHODONE
exit /b
 
:ECHODONE
<nul set /p strTemp=Done
echo.
exit /b
 
:ECHOEMPTY
<nul set /p strTemp=Already Empty
echo.
exit /b
Как прикрутить сюда проверку наличия файлов в обеих директориях и сделать call :ECHOEMPTY, если обе пусты, но выполнить :OPERATION и вызывать call :ECHODONE, если хотя бы в одной оказались файлы ?
Пробовал подставить проверку dir D:\Dir1\* /a-d 2>nul >nul &&
Но вышло только для одной директории, либо обрабатывать каждую поочередно, чего делать не хочется.

PS Менять права и разрешения директорий нельзя, только файлов

Заранее спасибо.

Добавлено через 7 минут

Вложенных директорий в D:\Dir1 и D:\Dir2 нет и не предполагается.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2015, 13:14
Ответы с готовыми решениями:

Выполнение операций с выделенными файлами через контектное меню Проводника
Здравствуйте. Ситуация такая - есть папка куда сотрудники скидывают файлы на отправку через...

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

Выполнение простейших арифметических операций
Разработать процедуру (и вспомогательную программу) выполняющую простейшие арифметические операции....

Оптимизировать алгоритм, чтобы уменьшить количество операций для проверок деления
Всего один вопрос. Как оптимизировать алгоритм, чтобы уменьшить количество операций для проверок...

Выполнение больших операций
В программе выполняется большое количество расчетов за одно событие. Как избежать зависания?

13
alpap
1885 / 1383 / 455
Регистрация: 26.04.2015
Сообщений: 4,694
09.09.2015, 18:38 2
vavun, Поюзайте это, 100% вдохновит:
Windows Batch file
1
2
3
@echo on
dir "%Userprofile%\Desktop\1\*.*" /b | find /v "">nul && echo NOT EMPTY || ECHO EMPTY
pause
.
1
vavun
9927 / 5285 / 813
Регистрация: 07.04.2013
Сообщений: 15,336
09.09.2015, 19:03  [ТС] 3
alpap, очень даже ничего )
Но я не пойму, как сделать для двух и более директорий ?
Уверен, что должно быть простое решение.

Пойду перечитывать справку по for

Добавлено через 3 минуты
Получается или эхо для каждой (то есть два раза) либо одно эхо, но только для одной директории.

Добавлено через 7 минут
Костыль, а хочется красиво ...

Windows Batch file
1
2
3
4
5
6
7
@echo off
for %%A in (D:\TMP1 D:\TMP) do dir "%%~A\*.*" /b | find /v "">nul && Set /A n+=1
if %n% neq 0 echo NOT EMPTY
 
 
pause
exit /B
Добавлено через 2 минуты
Эмм ... исправлять не буду, ну, в общем, вы мысль поняли
0
alpap
1885 / 1383 / 455
Регистрация: 26.04.2015
Сообщений: 4,694
09.09.2015, 19:29 4
vavun, А с %%A не ошиблись, одна и таже переменная в двух циклах, во-втором бы поменять уже на B
0
vavun
9927 / 5285 / 813
Регистрация: 07.04.2013
Сообщений: 15,336
09.09.2015, 19:32  [ТС] 5
alpap, в целом понял, но не понял.
А приведите, пожалуйста, пример ?
0
Garry Galler
1915 / 1455 / 550
Регистрация: 28.10.2013
Сообщений: 3,732
09.09.2015, 21:58 6
vavun, А так?
Windows Batch file
1
2
3
4
5
6
7
8
for %%A in (D:\Dir1\* D:\Dir2\*) do (
  rem считаем общий размер файлов - если в итоге будет 0, значит файлов нет, либо они нулевого размера
  set /a size+=%%~zA
  rem здесь что-то делаем с файлами - как видим второй цикл вовсе не нужен
  echo %%A
)
rem выбираем метку куда будем переходить
if %size%==0 goto :ECHOEMPTY || goto :ECHODONE
Добавлено через 9 минут
...Упс. Забыл, что cmd не C# и огромных чисел не понимает

Добавлено через 36 минут
Но, в принципе, можно и так сделать:
Windows Batch file
1
2
3
4
5
6
7
8
9
for %%A in (D:\Dir1\* D:\Dir2\*) do (
  rem set /a "size|=1<<%%A"
  rem если файлов нет ни в одной папке, то и цикла не будет, а раз так достаточно одноразового присвоения значения
  set hasfiles=1
  rem здесь что-то делаем с файлами - как видим второй цикл вовсе не нужен
  echo %%A
)
rem выбираем метку куда будем переходить
if not defined hasfiles goto :ECHOEMPTY || goto :ECHODONE
Добавлено через 12 минут
правка
0
ComSpec
3409 / 1953 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
10.09.2015, 02:24 7
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
set dirs="D:\Dir1" "D:\Dir2"
 
2>nul dir/a-d/b %dirs%| >nul findstr ^^
if not errorlevel 1 (call :OPERATION) else (call :ECHOEMPTY)
pause>nul
exit /b 0
 
:OPERATION
<nul set /p strTemp="Масло пошло   "
 
for %%A in (%dirs%) do >nul 2>&1 (
   takeown /A /F "%%~A\*"
   icacls "%%~A\*" /Q /C /grant "Администраторы:(F)"
)
call :ECHODONE
exit /b
 
:ECHODONE
<nul set /p strTemp=Done
echo.
exit /b
 
:ECHOEMPTY
<nul set /p strTemp=Already Empty
echo.
exit /b
2
alpap
1885 / 1383 / 455
Регистрация: 26.04.2015
Сообщений: 4,694
10.09.2015, 13:58 8
Нда, вот же ж голова!
0
Garry Galler
1915 / 1455 / 550
Регистрация: 28.10.2013
Сообщений: 3,732
10.09.2015, 14:12 9
Может я чего-то не понимаю, но зачем вообще делать предварительную проверку наличия файлов в каталогах, если цикл вида
Windows Batch file
1
for %%A in (D:\Dir1\* D:\Dir2\* D:\Dir3\* D:\Dir4\*) do ()
делает это в автономном режиме? Есть файлы->есть цикл, нет файлов-> нет цикла. И кстати, поддиректории исключаются автоматически.
0
sov44
1760 / 744 / 128
Регистрация: 09.04.2011
Сообщений: 1,314
10.09.2015, 15:13 10
ComSpec, схожая задача. Нужно перебрать дерево папок и найти (удалить) пустые папки. Творческий тупик.
0
alpap
1885 / 1383 / 455
Регистрация: 26.04.2015
Сообщений: 4,694
10.09.2015, 16:02 11
sov44, Вот так можно:
Windows Batch file
1
2
3
4
@echo on
set "in=%Userprofile%\Desktop\papka"
for /r "%in%" %%i in (.) do dir "%%~i" /b | find /v "">nul || rd /s /q "%%~i"
pause
.
2
sov44
1760 / 744 / 128
Регистрация: 09.04.2011
Сообщений: 1,314
10.09.2015, 16:07 12
alpap, точно!

Не по теме:

как сам не додумался...

0
Garry Galler
1915 / 1455 / 550
Регистрация: 28.10.2013
Сообщений: 3,732
10.09.2015, 17:59 13
Нужно перебрать дерево папок и найти (удалить) пустые папки.
Так как вариант выше дерево пустых вложенных папок оставляет на месте, то вот вариант и для такого случая:
Windows Batch file
1
2
3
4
5
:: удаление дерева папок, не содержащих файлов, а также пустых вложенных каталогов
:: т.е каждый каталог содержащий только пустой каталог также будет удален по цепочке начиная с самого нижнего уровня вложенности
pushd "%~dp0"
for /f "delims=" %%i in ('dir /ad/b/s ^| sort /r') do (rd "%%i" 2>nul  && echo "Delete: %%i">>log.txt)
popd
PS: вывод в лог добавлен для наглядности.
0
vavun
9927 / 5285 / 813
Регистрация: 07.04.2013
Сообщений: 15,336
10.09.2015, 23:28  [ТС] 14
ComSpec, уяснил для себя еще пару моментов, кроме основного вопроса, спасибо )
0
10.09.2015, 23:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2015, 23:28

Фоновое выполнение операций
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include...

Выполнение арифметических операций
Здравствуйте ! Как реализовать это на php ? : &quot;Сколько будет '5' + '5' ?&quot; Ответ PHP &quot;Сумма...

Выполнение операций в отдельном потоке
Всем привет! Вот тут я спрашивал, как залогировать батник в RichTextBox:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru