PDA

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


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

Iska
28-09-2018, 20:24
который единожды создаётся »
Чем создаётся?

в каталоге c:\temp\folder »
И сколько там всего подкаталогов?

man8531
28-09-2018, 20:27
Чем создаётся? »
программой. создаётся всего один каталог, больше там вообще ничего нет.

Iska
28-09-2018, 21:12
@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
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
нужен !


@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
Serguei Kouzmine,
не работает этот вариант, он вместе со знаком восклицания имя переменной вставляет, а не саму переменную.

Serguei Kouzmine
29-09-2018, 00:31
у вас где то опечатка - я вставил рабочий код

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

megaloman
29-09-2018, 02:15
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
megaloman,
всё как нужно, спасибо!

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

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

Iska
29-09-2018, 11:34
но Вы не полностью видите всю картину просто: »
Что мешало Вам изначально изложить задачу вместо изложения выбранного решения?

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

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

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

man8531
29-09-2018, 11:46
Что мешало Вам изначально изложить задачу вместо изложения выбранного решения? »
не хотел забивать помогающему голову лишней информацией. нужно было просто заставить батник создавать переменную из уникального имени каталога, а дальше я уже сам допилю его под свои нужды.
И Вы можете сходу назвать пару-тройку аналогичных задач? »
такая же манипуляция с профилем Thunderbird, например.

Iska
29-09-2018, 12:14
такая же манипуляция с профилем Thunderbird, например. »
И…? Pale Moon, WaterFox, SeaMonkey и т.п. Так и я могу ;), всё это базируется на одном и том же принципе. Но суть в том, что изложенное мною будет работать и для:
такая же манипуляция с профилем Thunderbird, например »
и для Pale Moon, и для WaterFox, и для SeaMonkey, и для любых прочих продуктов, базирующихся на коде от Mozilla Foundation. И получается, что Ваше «нигде»:
он бы уже не пригодился нигде, кроме как в этой ситуации. »
пока совсем не в тему. Понимаете, о чём я?

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

Iska
29-09-2018, 12:24
но главное - что результат достигнут. »
Не могу с Вами тут согласиться, коллега. Главное — что мы друг друга поняли ;).




© OSzone.net 2001-2012