Войти

Показать полную графическую версию : [решено] Переменная cmd


Bruce Wayne
26-02-2012, 23:24
Доброе время суток!

У меня вопрос по поводу переменных в 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
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
Iska, спасибо большое за помощь, но не работает батник - мелькает окно и всё :( Говорит, что "не удаётся найти указанную метку пакетного файла - DelByMask".

Foreigner
28-02-2012, 00:02
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
А зачем такая галиматья с переменными? »
А так:
for %%i in ("%userprofile%\Stark industries\Developments" "%programfiles%\Stark industries") do (
for %%j in (*.cmp *.tech *.strk) do del "%%~i\*.%%j"
)

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

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

Foreigner
28-02-2012, 06:41
for %%j in (*.cmp *.tech *.strk) do del "%%~i\*.%%j" »
Зачем в цикле маска файлов? Он и будет искать файлы, но будет искать их в текущей директории.

Iska
28-02-2012, 08:24
Foreigner, я к тому, что в общем случае (не в данном, конкретном) маски могут быть сложными, и так просто вычленить в перебор одни расширения (и приписывать шаблон в конечной команде) не всегда будет возможным.

Bruce Wayne
02-03-2012, 21:20
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
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
Devils0411, значение присваивается, но не подставляется в команду START, так как командная строка формируется ДО команды присвоения, нужно использовать отложенное раскрытие переменных:start /wait .\%1-%2-%3 /!silent! /norestart




© OSzone.net 2001-2012