Компьютерный форум 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=336906)

man8531 28-09-2018 20:04 2833357

имя каталога в переменную
 
здравствуйте
подскажите, пожалуйста, как решить задачу:
есть имя каталога, в каталоге c:\temp\folder, который единожды создаётся и у него оно всегда разное. хотелось, чтобы производилось считывание имени каталога и создавалась переменная из этого имени. заранее крайне признателен!

Iska 28-09-2018 20:24 2833368

Цитата:

Цитата man8531
который единожды создаётся »

Чем создаётся?

Цитата:

Цитата man8531
в каталоге c:\temp\folder »

И сколько там всего подкаталогов?

man8531 28-09-2018 20:27 2833371

Цитата:

Цитата Iska
Чем создаётся? »

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

Iska 28-09-2018 21:12 2833381

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sRootFolder=c:\temp\folder
set sSubFolder=

if exist "%sRootFolder%\." (
        for /f "usebackq delims=" %%i in (
                `2^>nul dir /b /a:d /o:-n "%sRootFolder%\*.*"`
        ) do set sSubFolder=%%~i

        if defined sSubFolder (
                echo [!sSubFolder!].
        ) else (
                echo Can't find any subfolders in root folder [%sRootFolder%].
                exit /b 2
        )
) else (
        echo Can't find root folder [%sRootFolder%].
        exit /b 1
)

endlocal
exit /b 0


man8531 28-09-2018 22:16 2833403

Iska,
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sRootFolder=C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles
if exist "%sRootFolder%\." (
        for /f "usebackq delims=" %%i in (
                `2^>nul dir /b /a:d /o:-n "%sRootFolder%\*.*"`
        ) do set sSubFolder=%%~i
copy "%sRootFolder%\%sSubFolder%\*.*" "D:\Downloads\"
)
echo %sSubFolder%
endlocal
exit /b 0

посмел немного изменить под себя командный файл. получилось так. но он не хочет копировать, вернее - не вставляет переменную %sSubFolder% в конец пути. хотя echo выводит на экран переменную:
Код:

d:\>profiles.cmd
C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\\*.*
Не удается найти указанный файл.
Скопировано файлов:        0.
p3o9zhrw.default

если использовать xcopy /Y /E , то пишет, что не удалось найти указанный путь.

Serguei Kouzmine 28-09-2018 22:39 2833417

нужен !

Код:

@echo off
setlocal enableextensions enabledelayedexpansion
set user=%username%
set sRootFolder=C:\Users\%user%\AppData\Roaming\Mozilla\Firefox\Profiles
if exist "%sRootFolder%\." (
        for /f "usebackq delims=" %%i in (
                `2^>nul dir /b /a:d /o:-n "%sRootFolder%\*.*"`
        ) do set sSubFolder=%%~i
echo copy "%sRootFolder%\!sSubFolder!\*.*" "c:\temp\"
)
echo %sSubFolder%
endlocal
exit /b 0

дает
Код:

copy "C:\Users\Serguei\AppData\Roaming\Mozilla\Firefox\Profiles\07p9upxo.default
\*.*" "c:\temp\"


man8531 28-09-2018 22:52 2833424

Serguei Kouzmine,
не работает этот вариант, он вместе со знаком восклицания имя переменной вставляет, а не саму переменную.

Serguei Kouzmine 29-09-2018 00:31 2833431

у вас где то опечатка - я вставил рабочий код

если хоите хелп про ! (disable delayed environment variable
expansion
https://stackoverflow.com/questions/...hat-does-it-do
Using !var! in place of %var% accesses the changed value of var.

megaloman 29-09-2018 02:15 2833434

man8531, Не надо восклицаний и сетлокалов
Код:

@Echo Off
cls

Set "sRootFolder=C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles"
Set "sOutFolder=D:\Downloads"

If Not Exist "%sOutFolder%\" (Echo Can't find folder "%sOutFolder%" &Pause &Exit /B 1)

Set "sSubFolder="
FOR /F "usebackq delims=" %%d IN (`Dir "%sRootFolder%\" /A:D /B /O:D /T:W 2^>nul`) DO Set "sSubFolder=%sRootFolder%\%%d"
If "%sSubFolder%"=="" (Echo Can't find subfolders in folder "%sRootFolder%" &Pause &Exit /B 2)

Echo XCopy /Y /E "%sSubFolder%\*.*" "%sOutFolder%\"
XCopy /Y /E "%sSubFolder%\*.*" "%sOutFolder%\" ||Exit /B 3

pause
Exit /B 0

Если батник исполняется для активного пользователя, то лучше применить
Код:

Set "sRootFolder=%APPDATA%\Mozilla\Firefox\Profiles"

man8531 29-09-2018 06:30 2833438

megaloman,
всё как нужно, спасибо!

Iska 29-09-2018 09:04 2833445

man8531, для сведения — Ваше:
Цитата:

Цитата man8531
создаётся всего один каталог, больше там вообще ничего нет. »

в корне неверно: в каталоге %APPDATA%\Mozilla\Firefox\Profiles может быть куда больше, нежели, чем один подкаталог. И правильным будет не искать какие-то невнятные подкаталоги, а открывать ini-файл %APPDATA%\Mozilla\Firefox\profiles.ini, читать его содержимое, выбирать раздел с параметром Default равным 1, проверять в этом разделе параметр IsRelative и, учитывая его значение, получать полный путь к профилю из параметра Path.

man8531 29-09-2018 10:35 2833454

Iska,
согласен, это верно, если исходить из того, что там лежит много профилей. но Вы не полностью видите всю картину просто: там будет только один каталог с уникальным именем, тк командный файл будет отрабатываться на "чистой" машине после клона. то есть, после клона, в папке с уникальным именем, будет происходить полная чистка и последующее копирование эталонного профиля с предустановленными расширениями и закладками. этот командный файл - частичка большого командного файла, который производит установку необходимого софта после клона пк. плюс, в дальнейшем этот батник пригодится для других похожих целей, а в случае с ini, он бы уже не пригодился нигде, кроме как в этой ситуации.

Iska 29-09-2018 11:34 2833464

Цитата:

Цитата man8531
но Вы не полностью видите всю картину просто: »

Что мешало Вам изначально изложить задачу вместо изложения выбранного решения?

Цитата:

Цитата man8531
в дальнейшем этот батник пригодится для других похожих целей »

И Вы можете сходу назвать пару-тройку аналогичных задач?

Цитата:

Цитата man8531
плюс, в дальнейшем этот батник пригодится для других похожих целей, а в случае с ini, он бы уже не пригодился нигде, кроме как в этой ситуации. »

А ни «этот батник», ни вообще «батник» для работы с profiles.ini в принципе не годятся, потому как его кодировка — UTF-8 без BOM.

В любом случае, как поступать — дело Ваше. Я Вам изложил — как поступать правильно.

man8531 29-09-2018 11:46 2833467

Цитата:

Цитата Iska
Что мешало Вам изначально изложить задачу вместо изложения выбранного решения? »

не хотел забивать помогающему голову лишней информацией. нужно было просто заставить батник создавать переменную из уникального имени каталога, а дальше я уже сам допилю его под свои нужды.
Цитата:

Цитата Iska
И Вы можете сходу назвать пару-тройку аналогичных задач? »

такая же манипуляция с профилем Thunderbird, например.

Iska 29-09-2018 12:14 2833473

Цитата:

Цитата man8531
такая же манипуляция с профилем Thunderbird, например. »

И…? Pale Moon, WaterFox, SeaMonkey и т.п. Так и я могу ;), всё это базируется на одном и том же принципе. Но суть в том, что изложенное мною будет работать и для:
Цитата:

Цитата man8531
такая же манипуляция с профилем Thunderbird, например »

и для Pale Moon, и для WaterFox, и для SeaMonkey, и для любых прочих продуктов, базирующихся на коде от Mozilla Foundation. И получается, что Ваше «нигде»:
Цитата:

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

пока совсем не в тему. Понимаете, о чём я?

man8531 29-09-2018 12:22 2833476

Iska,
говорить можно долго о недосказонностях или некорректных сказанностях, но главное - что результат достигнут. спасибо за оказанную помощь

Iska 29-09-2018 12:24 2833478

Цитата:

Цитата man8531
но главное - что результат достигнут. »

Не могу с Вами тут согласиться, коллега. Главное — что мы друг друга поняли ;).


Время: 21:21.

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