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

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

Bruce Wayne 26-02-2012 23:24 1867282

Переменная cmd
 
Доброе время суток!

У меня вопрос по поводу переменных в cmd- и bat-скриптах: есть батник такой, который удаляет в определённых мной папках файлы, по соответствующим расширениям (он работает):

Код:

set i=del "%userprofile%\Stark industries\Developments\
set e=" /s /q
%i%*.strk%e%
%i%*.cmp%e%
%i%*.tech%e%
%i%*.temp%e%
%i%*.hjk%e%
set i=del "%programfiles%\Stark industries\
%i%*._mp%e%%i%*.strk%e%
%i%*.cmp%e%
%i%*.tech%e%
%i%*.temp%e%
%i%*.hjk%e%
set i=del "%allusersprofile%\Stark industries\Technologies
%i%*.strk%e%
%i%*.cmp%e%
%i%*.tech%e%
%i%*.temp%e%
%i%*.hjk%e%

Так вот, я хотел бы объединить все команды с удалением файлов по расширению в переменную, меняя при этом только переменные пути, но ничего не получается, видимо, я где-то допускаю ошибку, а какую - не знаю.

Код:

set i=del "%userprofile%\Stark industries\Developments\
set e=" /s /q
set k=(
%i%*.strk%e%
%i%*.cmp%e%
%i%*.tech%e%
%i%*.temp%e%
%i%*.hjk%e%
)
set i=del "%programfiles%\Stark industries\
%k%
set i=del "%allusersprofile%\Stark industries\Technologies
%k%

Ещё вот так пробовал:

Код:

set i=del "%userprofile%\Stark industries\Developments\
set e=" /s /q
set k=%i%*.strk%e% && %i%*.cmp%e% && %i%*.tech%e% && %i%*.temp%e% && %i%*.hjk%e%
%k%
set i=del "%programfiles%\Stark industries\
%k%
set i=del "%allusersprofile%\Stark industries\Technologies
%k%

Он (батник) выполняет операции только для первого пути (%userprofile%\Stark industries\Developments), а остальные - игнорирует (дважды делает поиск первого типа файлов *.strk в первом пути %userprofile%\Stark industries\Developments). То есть, получается, что батник не перезаписывает переменную... Как переправить именно этот вариант, если такое возможно? Подскажите, пожалуйста, кто знает, очень нужно! Заранее спасибо!

*Примечание: это - только фрагмент скрипта (оригинал занимает несколько страниц), поэтому данные действия я хочу выполнить для более компактного вида.

Iska 27-02-2012 08:18 1867427

Bruce Wayne, например, так:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sCompany=Stark industries
set sPaths="%userprofile%\%sCompany%\Developments" "%programfiles%\%sCompany%" "%allusersprofile%\%sCompany%\Technologies"
set sMasks=*.strk *.cmp *.tech *.temp *.hjk *._mp

for %%i in (%sPaths%) do (
        call :DelByMask "%%~i" %sMasks%
)

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:DelByMask
        setlocal enableextensions enabledelayedexpansion
       
        set sPath=%~1
       
:NextMask
        set sMask=%~2
       
        if defined sMask (
                2>nul del /f /q "%sPath%\%sMask%"
                shift /2
                goto :NextMask
        )
       
        endlocal
        exit /b 0
rem ==========================================================================


Bruce Wayne 27-02-2012 23:31 1867992

Iska, спасибо большое за помощь, но не работает батник - мелькает окно и всё :( Говорит, что "не удаётся найти указанную метку пакетного файла - DelByMask".

Foreigner 28-02-2012 00:02 1868006

Bruce Wayne,

А зачем такая галиматья с переменными? Запихни все в цикл и удаляй:
Код:

for %%i in ("%userprofile%\Stark industries\Developments" "%programfiles%\Stark industries") do (

    for %%j in (cmp tech strk) do del "%%~i\*.%%j"

)


Iska 28-02-2012 00:42 1868032

Цитата:

Цитата Foreigner
А зачем такая галиматья с переменными? »

А так:
Код:

for %%i in ("%userprofile%\Stark industries\Developments" "%programfiles%\Stark industries") do (
    for %%j in (*.cmp *.tech *.strk) do del "%%~i\*.%%j"
)

у Вас работает?

Цитата:

Цитата Bruce Wayne
"не удаётся найти указанную метку пакетного файла - DelByMask". »

Попробуйте скопировать код ещё раз: скорее всего Вы скопировали его не целиком.

Foreigner 28-02-2012 06:41 1868106

Цитата:

Цитата Iska
for %%j in (*.cmp *.tech *.strk) do del "%%~i\*.%%j" »

Зачем в цикле маска файлов? Он и будет искать файлы, но будет искать их в текущей директории.

Iska 28-02-2012 08:24 1868141

Foreigner, я к тому, что в общем случае (не в данном, конкретном) маски могут быть сложными, и так просто вычленить в перебор одни расширения (и приписывать шаблон в конечной команде) не всегда будет возможным.

Bruce Wayne 02-03-2012 21:20 1871165

Iska, да, действительно, всё работает!) Спасибо большое за помощь Вам и Foreigner! Извините за то, что усомнился. :up

P. S. Э... Только один вопрос ещё: как сделать так, чтобы он ещё и из вложенных папок удалял?

P. P. S. А, всё, сам понял: нужно строчку
Код:

2>nul del /f /q "%sPath%\%sMask%"
подредактировать на
Код:

2>nul del /f /q /s "%sPath%\%sMask%"
Ещё раз огромное спасибо!

Devils0411 14-08-2013 11:24 2201271

Код:

REM @Echo off
setlocal enableextensions enabledelayedexpansion
if exist "%ProgramFiles(x86)%" (set bit=x64) else (set bit=x86)
title Установка обновлений для Windows %bit%
wmic qfe get HotFixID >temp.txt
type temp.txt > ListUpdates.txt
if exist %~n0.log del /S /Q %~n0.log >nul
if exist %~n0.log del /S /Q temp.txt >nul
for /F "Tokens=2 Delims=-" %%a in ('Dir /B ".\*.msu" Dir /B ".\*.exe"') do call :counter %%a
echo Количество обновлений %i%
For /F "Tokens=1-3* Delims=-" %%a in ('Dir /B ".\*.msu" Dir /B ".\*.exe"') do call :matching %%a %%b %%c %%d
del /S /Q ListUpdates.txt >nul
goto :EOF

:counter
for /f "Tokens=1 Delims= " %%e in ('FindStr /IB "%1" "ListUpdates.txt"') do set upd=%%e
SET /A i+=1
goto :EOF

:matching
Set Version=%3
If /i "!Version:~0,1!"=="v" (Set UpdNameVer=%~2-%~3
) Else (
Set UpdNameVer=%~2)
for /f "Tokens=1 Delims= " %%f in ('FindStr /IB "%2" "ListUpdates.txt"') do set upd=%%f
set /A i-=1
if "%2"=="%upd%" (
echo Обновление %UpdNameVer% присутствует в системе.        Осталось %i% обновлений.
echo Обновление %UpdNameVer% присутствует в системе.        Осталось %i% обновлений.>>%~n0.log
) else (
if /i "%4"=="" (
if /i "%3"=="%bit%.exe" (
set silent=q
start /wait .\%1-%2-%3 /%silent% /norestart
) else (
set silent=quiet
start /wait .\%1-%2-%3 /%silent% /norestart
)
) else (
if /i "%4"=="%bit%.exe" (
set silent=q
start /wait .\%1-%2-%3-%4 /%silent% /norestart
) else (
set silent=quiet
start /wait .\%1-%2-%3-%4 /%silent% /norestart
)
)
echo Обновление %UpdNameVer% установлено.                Осталось %i% обновлений.
echo Обновление %UpdNameVer% установлено.                Осталось %i% обновлений.>>%~n0.log
)

Объясните пожалуйста, почему переменная silent не присваивает значение, которое ему задано? Где ошибка?

amel27 14-08-2013 11:45 2201288

Devils0411, значение присваивается, но не подставляется в команду START, так как командная строка формируется ДО команды присвоения, нужно использовать отложенное раскрытие переменных:
Код:

start /wait .\%1-%2-%3 /!silent! /norestart


Время: 18:38.

Время: 18:38.
© OSzone.net 2001-