#arrays #batch-file #cmd
#массивы #пакетный файл #cmd
Вопрос:
нужна небольшая помощь с проектом.
Сценарий :-
Перенос ПК вручную в новый домен приводит к сбою части программного обеспечения из-за того, что новый профиль не имеет настроек из старого профиля пользователя, необходимых для его запуска. Старый профиль называется одним, новый — чем-то другим, например
C:UsersSue.Barnes.B3209 (old) C:UsersSusan.Barnes.NGP (new)
В %localappdata% каждого (старого) профиля «возможно» есть конфигурационный файл для этого программного обеспечения, если пользователь использовал его ранее. Например.
C:UsersSue.Barnes.B3209AppDataLocalAcme_LimitedAcme.exe_Url_m5l4ujc5t22f3qw0q5uz1dwlfcnrdaoh1.0.0.15user.config
Цели :-
Я хочу иметь возможность сканировать C:Users Папку и сообщите полный путь, имя и расширение файла, в котором он найден, затем установите список в меню выбора, где при выборе ввода будет скопирован файл user.config в то же самое место, но в текущем зарегистрированном новомпрофилируйте папку appdata.
например
Enumerating List Of User Profiles in the System...
Admin
Public
User
From the Profiles detecting active Configs...
C:UsersAdminAppDataLocalAcme_LimitedAcme.exe_Url_m5l4ujc5t22f3qw0q5uz1dwlfcnrdaoh1.0.0.15user.config
C:UsersPublicAppDataLocalAcme_LimitedAcme.exe_Url_m5l4ujc5t22f3qw0q5uz1dwlfcnrdaoh1.0.0.15user.config
Press any key to continue . . .
Однако на данный момент я не в своей тарелке. Кажется, я не могу создать меню выбора для каждого экземпляра, в котором найден файл. Сколько бы их ни было найдено, я бы хотел, чтобы на экране было напечатано число, чтобы я мог выбрать правильную конфигурацию для копирования во вновь настроенный профиль. Просто,
Xcopy /f C:UsersSue.Barnes.B3209AppDataLocalAcme_LimitedAcme.exe_Url_m5l4ujc5t22f3qw0q5uz1dwlfcnrdaoh1.0.0.15user.config
%localappdata%Acme_LimitedAcme.exe_Url_m5l4ujc5t22f3qw0q5uz1dwlfcnrdaoh1.0.0.15
Текущая база кода :-
echo.
echo Enumerating List Of User Profiles in the System...
echo.
TIMEOUT /T 3 >NUL
dir /b C:Users
echo.
echo From the Profiles detecting active Configs...
echo.
TIMEOUT /T 3 >NUL
for /R "C:Users" %%a in (1.0.0.15user.config*) do (
echo %%~dpnxa
)
)
echo.
pause
Любая помощь будет высоко оценена, спасибо
Комментарии:
1. каков верхний предел файлов конфигурации, которые вы ожидаете вернуть?
2. Не более 10, … Спасибо
3. Мне кажется, что эту задачу можно лучше решить, используя базовый текстовый файл, который должен содержать отдельные строки, каждая из которых содержит старые и новые имена пользователей в качестве пар ключей, возможно, например,
Sue.Barnes.B3209:Susan.Barnes.NGP
. Не должно быть необходимости во взаимодействии, например, в системе меню, просто повторите деревья каталогов каждого старого имени пользователя, получите полные пути user.config и выполните передачу файла, заменив имя пользователя на соответствующее парное новое имя.
Ответ №1:
@ECHO OFF
SETLOCAL
SET "sourcedir=U:sourcedir"
set "dontshow=u:dontshow.txt"
set "configs=u:configs.txt"
set "profiles=u:profiles.txt"
:again
echo :>>"%dontshow%"
del "%configs%" >nul 2>nul
del "%profiles%" >nul 2>nul
:: Find all of the "user.config" files having ..appdatalocalAcme_limited...1.0.0.15
FOR /f "tokens=1-9delims=" %%a IN (
'dir /s /b /a-d "%sourcedir%user.config" '
) DO if /i "%%d"=="appdata" if /i "%%e"=="local" if /i "%%f"=="Acme_Limited" if /i "%%h"=="1.0.0.15" (
rem these are the users' config files that may be copied.
echo %%c|findstr /x /g:"%dontshow%" /i /L >nul
if errorlevel 1 >>"%configs%" echo %%c
)
:: Find all of the user profiles that are not in "dontshow" and do NOT have "user.config" - These are the profiles that may need to be processed
FOR /f "delims=" %%a IN (
'dir /b /ad "%sourcedir%" '
) DO (
echo %%a|findstr /x /g:"%dontshow%" /i /L >nul
if errorlevel 1 echo %%a|findstr /x /g:"%configs%" /i /L >nul
if errorlevel 1 >>"%profiles%" echo %%a
)
:: Now we have a list of profiles with "user.config" missing in %profiles%
:: And possible source-profiles in %configs%
:: Show the list of "config missing" profiles
cls
findstr /n /v /L /c:":" "%profiles%"
:reselectd
set "selectiond="
set /p "selectiond=Choose destination profile "
if not defined selectiond goto :eof
for /f "tokens=1*delims=:" %%a in ('findstr /n /v /L /c:":" "%profiles%"') do if "%%a"=="%selectiond%" set "selectiond=%%b"amp;goto selects
echo Invalid selection
goto reselectd
:selects
for /L %%a in (1,1,4) do echo.
findstr /n /v /L /c:":" "%configs%"
:reselects
set "selections="
set /p "selections=Choose source profile "
if not defined selections goto :eof
for /f "tokens=1*delims=:" %%a in ('findstr /n /v /L /c:":" "%configs%"') do if "%%a"=="%selections%" set "selections=%%b"amp;goto process
echo Invalid selection
goto reselects
:process
echo Copy from profile "%selections%" to "%selectiond%" ?
choice
if errorlevel 2 goto again
:: Do the copy... just echoed, remove `echo` keyword to activate
ECHO md "%sourcedir%%selectiond%appdatalocalAcme_Limitedwhatever1.0.0.15"
ECHO copy "%sourcedir%%selections%appdatalocalAcme_Limitedwhatever1.0.0.15user.config" "%sourcedir%%selectiond%appdatalocalAcme_Limitedwhatever1.0.0.15"
choice /M "Add '%selections%' to processed file ? "
if errorlevel 2 goto processedd
>>"%dontshow%" echo %selections%
:processedd
choice /M "Add '%selectiond%' to processed file ? "
if errorlevel 2 goto again
>>"%dontshow%" echo %selectiond%
goto again
Интересное упражнение. Недостаток информации о том Acme.exe_Url_m5l4ujc5t22f3qw0q5uz1dwlfcnrdaoh
, что происходит (постоянная строка, изменение для каждого пользователя? Что?), хотя — оставлено в качестве упражнения для решения OP.
Вам нужно будет изменить настройку sourcedir
в соответствии с вашими обстоятельствами. В списке используется параметр, который подходит для моей системы.
Я решил, что ключевой частью является третий уровень каталога — идентификатор пользователя. Этот подход использует файлы идентификатора пользователя, два из которых являются временными, а один — постоянным — «dontshow.txt » который содержит список идентификаторов пользователей, КОТОРЫЕ НЕ следует показывать. При необходимости это можно поддерживать вручную с помощью редактора.
Итак, для начала добавьте строку, содержащую одно двоеточие, в файл «dontshow». Это фиктивный файл, который никогда не может соответствовать реальному идентификатору пользователя и требуется, потому findstr
что ему не нравится пустой файл словаря.
Первый шаг — найти все user.config
файлы и использовать for /f
для обработки найденных имен файлов, выбирая значимые уровни каталогов. После исключения любого пути, который не соответствует критериям, содержимое третьего уровня сопоставляется с исключениями в «dontshow.txt «. Если найденное имя новое, добавьте его в configs
файл.
Второй стих — такой же, как и первый, но на этот раз просматриваются только имена каталогов. Обратите внимание, что запись производится в profiles
, если найденное имя ОТСУТСТВУЕТ в dontshow
списке, А также ОТСУТСТВУЕТ в config
списке.
Теперь выберите целевой профиль, перечислив profiles
и добавив префикс linenumber:
с помощью findstr
. Введите число (ввод вручную, не отмечен), а затем сопоставьте номер строки с помощью for/f
.
Промойте и повторите для configs
файла для исходного профиля.
Отобразите предложенную команду, примите ответ Y / N, затем спросите, следует ли добавлять каждое имя в dontshow
список.
И так до утра.
Обратите внимание, что ответ Returnна любую из set /p
команд приведет к выходу из пакета.
Комментарии:
1. Это превосходно! Подправил биты для меня и выполняет свою работу — с прибамбасами! Спасибо, Магу!