Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   удалить файлы по маске из каталога (http://forum.oszone.net/showthread.php?t=215729)

Gablik 15-09-2011 22:32 1753870

удалить файлы по маске из каталога
 
проблема в том что 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 1753908

Вот ещё вопрос - как найти в файлы каком то каталоге не перемещаясь туда?

Iska 16-09-2011 01:47 1753967

Два варианта:
Код:

@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

Удаление производится в текущем каталоге.
Цитата:

Цитата Gablik
Вот ещё вопрос - как найти в файлы каком то каталоге не перемещаясь туда? »

Как обычно — указывая полный путь. Или всё же временно перемещаясь туда — пользуйте pushd/popd.

Gablik 16-09-2011 01:57 1753971

И последний вопрос
как через сценарий проверить что другой файл является батником или сценарием и запустить его?

Gablik 16-09-2011 02:33 1753978

Код:

@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 1753994

Цитата:

Цитата Gablik
как через сценарий проверить что другой файл является батником или сценарием и запустить его? »

Например, так:
Код:

@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

Цитата:

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

Укажите, как именно Вы вызываете пакетный файл, что указываете аргументами.

SANIOK_AV 16-09-2011 16:16 1754354

Извините что влажу :blush:
Iska, то есть для
Код:

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

Iska 06-12-2011 06:14 1810078

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

Цитата:

Цитата SANIOK_AV
Iska, то есть для
Код:

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

Не совсем так.

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

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

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

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

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

kiripanda 06-12-2011 18:04 1810473

Вложений: 1
Цитата:

Цитата Gablik
Del принимает только один параметр.»

O_o

Iska 06-12-2011 21:33 1810591

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

sov44 04-09-2012 07:19 1982581

При исполнении кода
Код:

@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 1982597

sov44, А зачем через "dir" удалять? Не проще:
Код:

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

sov44 04-09-2012 08:32 1982621

Цитата:

Цитата Foreigner
А зачем через "dir" удалять? »

скрипт ещё считает размер удаляемых файлов. Не показал на примере.

Foreigner 04-09-2012 10:33 1982678

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 1982714

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 1982869

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%



Время: 02:41.

Время: 02:41.
© OSzone.net 2001-