Пакет для / R результатов, которые будут установлены в меню выбора

#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. Это превосходно! Подправил биты для меня и выполняет свою работу — с прибамбасами! Спасибо, Магу!