alex_diablo
Постоянный участник
- Сообщения
- 144
- Реакции
- 9
Задача:
на файловой шаре, где много разного софта в куче разных вложенных подкаталогов есть прога (в данном случае Unity), у которой много разных версий (3.0.1, 3.0.2 ... 4.5.1, 4.5.2 и тд.). Все (или почти все) версии лежат каждая в отдельной папке (папки не обязательно пронумерованы по версии, вернее название папки может отличаться от шаблоны), установочные файлы именуются в виде: Unity_ver.4.6.1, setup_5.2.1 и т.д. т.е. каждая (почти каждая) версия пронумерована в соответствии с шаблоном вида *x.x.x.exe. нужно было сделать батник, в котором при вводе искомой версии установочного файла находился бы путь и подставлялся бы дальше в код скрипта (для дальнейшей установки на компы через psexec. после всех манипуляций с поиском, после нахождения полного пути до установочного файла, формируется автоматом другой батник и рассылается на требуемые компы.
сделал это так:
дальше переменную fulpath мы уже используем для подстановки в качестве пути для установки софта через psexec.
и все вроде бы хорошо, если например, вводишь 4.5.1 и файл с такими цифрами существует,
выводится полный путь с именем файла, который записываем во временный файл, а далее
записываем в переменную и уже используем где нужно:
Но на определенном этапе можно столкнуться с проблемой, что может оказаться два или более
одиннаковых результатов поиска (например: файл Unity_4.5.2.exe , который лежит в двух папках - x64 и х86, имя одинаковое, но разрядность разная, стало быть, разные файлы и лежат в разных местах). в этом случае в файл temp.txt скопируются все найденные пути, например:
но при последующей записи в переменную попадет только одна строка, в данном случае - первая в файле.
как быть в этом случае? как выбрать нужный файл? и как вообще узнать, один файл найден или несколько? можно конечно переименовать все файлы по шаблону, добавить в имя файла указание разрядности, чтобы поиск версии гарантированно выдавал только 1 файл, но это дополнительный ввод параметров при поиске... такое нежелательно.
частично сделал так:
и вот на этом шаге нужно предложить юзеру выбрать нужный путь. но я не знаю, как сделать это
с использованием меню? например - у нас 3 файла в разных путях, нужно, чтобы юзер мог нажать
1, 2 или 3, в зависимости от того, какой путь ему интересен. желательно конечно, чтобы возле каждого пути стояла цифра кнопки, которую нужно нажать.
думается, делать это можно через choice и if errorlevel
но как правильно увязать это с результатами поиска я не знаю, на ум приходит только так:
но это совсем не то, ибо вводить длиннющий путь вручную некрасиво и неудобно, теряется вообще смысл батника.
хотелось бы, чтобы в случае нахождения нескольких путей до файлов (например 3 файла) выводилось бы на экран что то типа этого:
т.е. по нажатию клавиш 1, 2 или 3 - у нас
прошу помощи в реализации задумки надеюсь, смысл задумки понятно объяснил...
зы. возможно, алгоритм поиска версии можно сделать по другому, лучше и проще и обойтись
без подсчета количества строк и записи все в отдельный файл...
буду рад любой помощи, включая оптимизацию кода)
на файловой шаре, где много разного софта в куче разных вложенных подкаталогов есть прога (в данном случае Unity), у которой много разных версий (3.0.1, 3.0.2 ... 4.5.1, 4.5.2 и тд.). Все (или почти все) версии лежат каждая в отдельной папке (папки не обязательно пронумерованы по версии, вернее название папки может отличаться от шаблоны), установочные файлы именуются в виде: Unity_ver.4.6.1, setup_5.2.1 и т.д. т.е. каждая (почти каждая) версия пронумерована в соответствии с шаблоном вида *x.x.x.exe. нужно было сделать батник, в котором при вводе искомой версии установочного файла находился бы путь и подставлялся бы дальше в код скрипта (для дальнейшей установки на компы через psexec. после всех манипуляций с поиском, после нахождения полного пути до установочного файла, формируется автоматом другой батник и рассылается на требуемые компы.
сделал это так:
Код:
rem вводим версию
set /p version=" >> Enter required version of Unity: "
rem ищем путь
where/r \\server\soft\Unity\ *%version%.exe >temp.txt
дальше переменную fulpath мы уже используем для подстановки в качестве пути для установки софта через psexec.
и все вроде бы хорошо, если например, вводишь 4.5.1 и файл с такими цифрами существует,
выводится полный путь с именем файла, который записываем во временный файл, а далее
записываем в переменную и уже используем где нужно:
Код:
set /p fullpath="" <temp.txt
Но на определенном этапе можно столкнуться с проблемой, что может оказаться два или более
одиннаковых результатов поиска (например: файл Unity_4.5.2.exe , который лежит в двух папках - x64 и х86, имя одинаковое, но разрядность разная, стало быть, разные файлы и лежат в разных местах). в этом случае в файл temp.txt скопируются все найденные пути, например:
CMD/BATCH:
\\server\soft\5.5.0\x86\unity_setup_5.5.0.exe
\\server\soft\5.5.0\x64\unity_setup_5.5.0.exe
\\server\soft\5.5.0\unity_setup_5.5.0.exe
но при последующей записи в переменную попадет только одна строка, в данном случае - первая в файле.
как быть в этом случае? как выбрать нужный файл? и как вообще узнать, один файл найден или несколько? можно конечно переименовать все файлы по шаблону, добавить в имя файла указание разрядности, чтобы поиск версии гарантированно выдавал только 1 файл, но это дополнительный ввод параметров при поиске... такое нежелательно.
частично сделал так:
Код:
rem читаем файл, считаем количество строк и в отдельный файл записываем цифру, равную количеству строк:
find /c /v "" <"temp.txt" >string.txt
rem из временного файла с одним лишь символом (цифрой, обозначающей количество строк в файле temp.txt), записываем этот символ в переменную:
set /p string="" <string.txt
rem проверка на кол-во строк: если =1, то выполняется дальше условие по установке (через метку goto переходим к нужной части скрипта).
if %string%==1 goto install
rem если цифра больше 1, то выводится сообщение, вида:
echo More then one path was founded:
rem и ниже выводим все строки с найденными путями:
echo.
type host2.txt
и вот на этом шаге нужно предложить юзеру выбрать нужный путь. но я не знаю, как сделать это
с использованием меню? например - у нас 3 файла в разных путях, нужно, чтобы юзер мог нажать
1, 2 или 3, в зависимости от того, какой путь ему интересен. желательно конечно, чтобы возле каждого пути стояла цифра кнопки, которую нужно нажать.
думается, делать это можно через choice и if errorlevel
но как правильно увязать это с результатами поиска я не знаю, на ум приходит только так:
Код:
set /p path=" >> type path manually: "
но это совсем не то, ибо вводить длиннющий путь вручную некрасиво и неудобно, теряется вообще смысл батника.
хотелось бы, чтобы в случае нахождения нескольких путей до файлов (например 3 файла) выводилось бы на экран что то типа этого:
CMD/BATCH:
"найдено n-файлов по заданной маске в следующих директориях:"
1 \\server\soft\5.5.0\x86\unity_setup_5.5.0.exe
2 \\server\soft\5.5.0\x64\unity_setup_5.5.0.exe
3 \\server\soft\5.5.0\unity_setup_5.5.0.exe
"выберите нужный файл"
прошу помощи в реализации задумки надеюсь, смысл задумки понятно объяснил...
зы. возможно, алгоритм поиска версии можно сделать по другому, лучше и проще и обойтись
без подсчета количества строк и записи все в отдельный файл...
буду рад любой помощи, включая оптимизацию кода)