Войти

Показать полную графическую версию : удалить файлы по маске из каталога


Gablik
15-09-2011, 22:32
проблема в том что Del принимает только один параметр. тогда проще может перейти в каталог для удаления и удалить оттуда? просто масок должно быть несколько

@echo off

ECHO Program 2
IF '%1'=='' (
ECHO No args
GOTO :END
) ELSE (
ECHO CHECK
GOTO :BEGIN )

:BEGIN
DEL %1
SHIFT /1
if '%1'=='' GOTO :END
GOTO :BEGIN
:END

пока что есть только это

Gablik
15-09-2011, 23:32
Вот ещё вопрос - как найти в файлы каком то каталоге не перемещаясь туда?

Iska
16-09-2011, 01:47
Два варианта:
@echo off
setlocal enableextensions enabledelayedexpansion

set sArgs=%*

if not defined sArgs (
echo Error: no arguments
echo.

call :Usage
exit /b 1
)

rem Вариант 1
call :DeleteByMask %sArgs%

rem Вариант 2, по-файлово
for %%i in (%sArgs%) do (
echo Delete [%%i]
del %%i 2>nul
)

endlocal
exit /b 0

:DeleteByMask
set sMask=%~1
if not defined sMask exit /b 0

echo Delete by [%sMask%]
del %sMask% 2>nul
shift
goto :DeleteByMask

:Usage
echo Usage:
echo %~nx0 ^<mask^> [^<mask^> ...]
exit /b 0
Удаление производится в текущем каталоге.
Вот ещё вопрос - как найти в файлы каком то каталоге не перемещаясь туда? »
Как обычно — указывая полный путь. Или всё же временно перемещаясь туда — пользуйте pushd/popd.

Gablik
16-09-2011, 01:57
И последний вопрос
как через сценарий проверить что другой файл является батником или сценарием и запустить его?

Gablik
16-09-2011, 02:33
@echo off

IF '%1'=='' (
ECHO NO ARGS
GOTO :END
) ELSE (
pushd %1
GOTO :BEGIN )
:BEGIN
DIR /B /S %2
SHIFT /2
IF '%2'=='' GOTO :END
GOTO :BEGIN
:END
popd

не работает. все равно находит файлы в каталоге где находится cmd Файл

Iska
16-09-2011, 04:09
как через сценарий проверить что другой файл является батником или сценарием и запустить его? »
Например, так:
@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~1

if defined sFile (
if exist "%sFile%" (
call :CheckExt "%sFile%" && echo File [%sFile%] is not executable || echo File [%sFile%] is executable
) else (
echo File [%sFile%] not found
)
) else (
echo Need argument
)


endlocal
exit /b 0

:CheckExt
setlocal
for %%i in (%PATHEXT:;= %) do if /i [%%i] == [%~x1] exit /b 1
exit /b 0
не работает. все равно находит файлы в каталоге где находится cmd Файл »
Укажите, как именно Вы вызываете пакетный файл, что указываете аргументами.

SANIOK_AV
16-09-2011, 16:16
Извините что влажу :blush:
Iska, то есть для call exitCode со значением "1" означает "завершение с ошибкой"?
И как вобще узнать эти значения для других команд?

Iska
06-12-2011, 06:14
SANIOK_AV, несколько раз начинал писать большую петицию, написание растягивалось, браузер падал, машина зависала… Стало быть, не судьба, отпишусь нынче коротко.

Iska, то есть для
call
exitCode со значением "1" означает "завершение с ошибкой"? И как вообще узнать эти значения для других команд?»
Не совсем так.

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

Тут, опять же, есть проблема — что именно считать ошибкой? Скажем, некоторые приложение вовсе не устанавливают код возврата, иные же, например, «choice.exe» — используют код возврата для уведомления родительского процесса о сделанном пользователем выборе, а не об ошибке.

Так что, является ли ненулевой код возврата ошибкой или не является — заранее сказать ничего нельзя, нужно знать конкретное приложение, о котором ведётся речь.

Возвращаясь к «call», скажу, что всё изложенное выше справедливо и для пакетных файлов — как Вы сочтёте нужным считать, так и будет.

Информацию о кодах возврата конкретных приложений стоит узнавать непосредственно из их документации (причём, от версии к версии информация может отличаться). Касаемо внутренних и внешних команд операционной системы документацию можно взять в «%SystemRoot%\Help\ntcmds.chm» — для XP, в Windows Command Reference (http://www.microsoft.com/download/en/details.aspx?id=2632) — для более старших версий и, наконец, в MSDN/TechNet/KB непосредственно на сайте Microsoft.

kiripanda
06-12-2011, 18:04
Del принимает только один параметр.»
O_o

Iska
06-12-2011, 21:33
Угу, для меня это тоже когда-то было откровением. Пусть теперь и коллега Gablik порадуется.

sov44
04-09-2012, 07:19
При исполнении кода @echo off
SetLocal enabledelayedexpansion

set "dr=%USERPROFILE%\Recent"
for /f "delims=" %%i in ('dir /b/s/a-d "%dr%\*.lnk" 2^>nul') do del /f/q "%%i"
pause
неожиданно обнаружился файл "Письмо «Re_ программа для ПК» — Dmitry Maksimov — Яндекс.Почта.lnk", который не удалился. Подскажите, как унифицировать код, чтобы удалялись файлы, в именах которых есть спецсимволы.

Foreigner
04-09-2012, 07:51
sov44, А зачем через "dir" удалять? Не проще:

del /s /a /f "%dr%\*.lnk"

sov44
04-09-2012, 08:32
А зачем через "dir" удалять? »
скрипт ещё считает размер удаляемых файлов. Не показал на примере.

Foreigner
04-09-2012, 10:33
sov44,
Тогда попробуй так:

@echo off
SetLocal enabledelayedexpansion

pushd "%USERPROFILE%\Recent" || goto:eof
for /f "tokens=3,4" %%i in ('dir /x /-c /a-d ^| findstr "\.LNK\>"') do (

echo размер для подсчета: %%i
del /f /q "%%~fsj"

)
popd
pause

sov44
04-09-2012, 11:39
Foreigner, спасибо! То, что надо!

К сожалению не удаётся отладить код, подскажите, в чём ошибка@echo off
SetLocal enabledelayedexpansion

set "dr=%USERPROFILE%\Recent"& call :Calc "!dr!" *.lnk
echo !iSumT!
pause
exit

:Calc
pushd "%1" || goto:eof
for /f "tokens=3,4" %%i in ('dir /x /-c /a-d "%~1" ^| findstr "\%2\>"') do (
set /a iSumT +=%%i
del /f /q "%%~fsj"
)
popd
GoTo :EOF

Foreigner
04-09-2012, 16:23
sov44, а что конкретно не работает? Пару замечаний:
1. Зачем все писать в одну строку? Такой необходимости вообще нет:

set "dr=%USERPROFILE%\Recent"
call :Calc "%dr%" *.lnk

2. Где уверенность, что сумма "iSum" в итоге не превышает 2147483648, что является предельным для cmd.exe? Если надо посчитать, то придется складывать поразрядно. Например так:

@echo off
setlocal enabledelayedexpansion

set "num1=0"
set "num2=0"
set "num3=0"

set "num1=000000000000000%1"
set "num1=%num1:~-15%"
set "num2=000000000000000%2"
set "num2=%num2:~-15%"

for /l %%i in (1,1,15) do (

set /a "sum=!num1:~-%%i,1!+!num2:~-%%i,1!+num3"
if !sum! geq 10 (set "num3=1" && set /a "sum-=10") else (set "num3=0")
set "res=!sum!!res!"

)

:zerout
if "%res:~0,1%"=="0" set "res=%res:~1%" && goto:zerout

echo %res%




© OSzone.net 2001-2012