cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, понял, благодарю. А ваше мнение, вариант 3 ???
|
Ander_73
- Стаж: 7 лет 9 месяцев
- Сообщений: 3821
- Репутация:127[+] [-]
|
cartmenezz, вариант номер 3 у меня используется везде. Только скобки там не нужны
|
korsak7
- Стаж: 9 лет
- Сообщений: 1063
- Репутация:62[+] [-]
|
78388korsak7, sergeysvirid, Благодарю за помощь. 783855 вариант сразу в топку это потому что папка Program Files (x86) может и ошибочно присутствовать (из-за какого-нибудь кривого репака, самой сборки винды,..) ??? именно так. поэтому варианты с проверкой наличия-отсутсвия файлов-папок ненадежны
|
wadimus
- Стаж: 8 лет
- Сообщений: 749
- Репутация:91[+] [-]
|
ну, наконец-то разбанили меня :) ща всё выложу cartmenezz, моё видЕние (или вИдение) решения проблемы сборника архивов: отдельная папка (к примеру Utils), в ней нужные файлы для распаковки: 7z.exe + 7z.dll два текстовых файла: where.txt - куда распаковывать архивы (в одну строчку!) типа:D:\моя папка для моих программ pass.txt - пароль архива (в одну строку!) типа:отдельно рядом с папкой Utls папки с архивами, к примеру 001 002 в каждой такой папке сам архив (к примеру file.7z), возможно и куча архивов (к примеру file1.7z file2.7z file3.7z) и батничек (start.bat) в батнике start.bat две переменных: p - пароль w - куда распаковывать заполняем их:Set /p p=<"..\Utls\pass.txt" Set /p w=<"..\Utls\where.txt" строка распаковки такая:forfiles /M *.7z /C "cmd /c "%~dp0..\Utls\7z.exe" x "@file" -y -o"%w%" -p%p%" --- вставка если не хотим распаковывать куда-то, то можно сделать проверку отсутствия файла where.txt если файла нет, то будем распаковывать архивы на рабочий стол (но переменную w определим в любом случае)if not exist "..\Utls\where.txt" ( for /f "tokens=2*" %%a in ( 'reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop') do set w=%%~b ) else ( Set /p w=<"..\Utls\where.txt" ) --- вставка и решение второй проблемы с разрядностью: достаточноif defined ProgramW6432 ( - выполнение для х64 ) else ( - выполнение для х86 )
|
Ander_73
- Стаж: 7 лет 9 месяцев
- Сообщений: 3821
- Репутация:127[+] [-]
|
78415if defined ProgramW6432 Кстати, прикольно. Оказывается, мы камраду cartmenezz советовали решение времен Висты, ибо:The ProgramW6432 and CommonProgramW6432 environment variables were added starting with Windows 7 and Windows Server 2008 R2.
|
wadimus
- Стаж: 8 лет
- Сообщений: 749
- Репутация:91[+] [-]
|
Ander_73, дык, старая заповедь программиста: работает? не переделывай!
|
Отправлено: 15-Июн-2020 22:53
(спустя 2 часа 4 минуты)
wadimus
- Стаж: 8 лет
- Сообщений: 749
- Репутация:91[+] [-]
|
cartmenezz, можно и так:for /f "tokens=3*" %%a in ( 'reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop') do set w=%%~a или так:for /f "tokens=2*" %%a in ( 'reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop') do set w=%%~b запрос по reg queryreg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop даст строку примерно такую:Desktop REG_SZ C:\Users\Admin\Desktop выбираем по обычному токену (пробел, таб): - 3-е и последующие (*) символы - первый вариант - или 2-е и последующие (*) символы но со сдвигом +1 (%%~b) - второй вариант во втором варианте используя (%%~a) получим REG_SZ %%~a - это: REG_SZ %%~b - это следующее вхождение: C:\Users\Admin\Desktop почему и последующие - возможно, Рабочий стол будет таким: C:\Users\Вася Иванович Петров\Desktop тогда по токену 2 получим: C:\Users\Вася по токену 3: Иванович а 2* дадут полное название: C:\Users\Вася Иванович Петров\Desktop сумбурно как-то Добавлено через 24 минуты 14 секунд: ЗЫ. как добавка .. из текстового файла pass.txt читаем только первую строку:если строк больше, в один файл pass.txt засунули много строк, например: в первой строке - куда распаковываем; во-второй строке пароль; в-третьей - подпапка от места, куда распаковали (чтобы все распаковки не кидались в одно место, а по подпапочкам размещались) как пример содержимое файла pass.txt:d:\наши распаковки 2020 архивы тогда используем сл.код:<"pass.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b") и в переменных s1 s2 s3 построчно строки:%s1% = d:\наши распаковки %s2% = 2020 %s3% = архивы распаковываем по пути:%s1%\%s3% = d:\наши распаковки\архивы используя пароль %s2%
|
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
wadimus, не скажу что все сразу понял, но буду перечитывать пока не пойму)) спасибо, полезная информация
|
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
wadimus, еще раз Здравствуйте Жара наконец немного спала, мозг заработал.. Почитал про циклы, все что нашел. Решил разобраться в том что вы написали, разложить для себя по полочкам, так сказать. Если Вас (или еще кого-нибудь знающего) не затруднит - проверьте мои выводы, поправьте где ошибаюсь. Вопрос 178428for /f "tokens=3*" %%a in (...) do set w=%%~a или так: for /f "tokens=2*" %%a in (...) do set w=%%~b - 3-е и последующие (*) символы - первый вариант - или 2-е и последующие (*) символы но со сдвигом +1 (%%~b) - второй вариант Тут я по началу не мог врубиться, в чем проблема первого варианта. Мне казалось что оба варианта равнозначны: 3я подстрока и последующие символы 2я подстрока и последующие символы со сдвигом +1 (поидее так же получится 3я и последующие) Наверное меня ввел в заблуждение синтаксис: почему "tokens=1,2,3*" ??? почему бы не писать "tokens=1,2,3,*" ??? Вот я и думал что в первом варианте переменной %%a достается весь текст, начиная с 3го токена. Нас самом деле последующие символы (*) идут в следующую переменную. Правильно??? Вопрос 2 Если забыть о том что в пути могут оказаться пробелы (или точно знать что их не будет) и использовать 1й вариант:for /f "tokens=3*" %%a in (...) do set w=%%~a то по идее "tokens=3*" и "tokens=3" дадут один результат, ведь переменную %%b мы все равно не используем, Правильно??? Вопрос 3.1<"pass.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b") попытался разложить все по пунктикам: <"pass.txt" - идет перенаправление ввода, считываем из файла tokens=1* - 1я подстрока пойдет в 1ю переменную %%a, оставшиеся символы - во 2ю переменную %%b delims=[] - меняем разделители (вместо стандартных пробела и таба) find /n /v "" - поиск и вывод строк, каждая из которых будет разбита на две подстроки (для значений переменных %%a и %%b), где /n - Вывод номеров отображаемых строк (формат вывода "[1]d:\наши распаковки", поэтому разделители и были заменены на []) /v - Вывод всех строк, НЕ содержащих заданную строку. В данном случае задана пустая строка (""), как итог - вывод всех строк Все правильно??? Вопрос 3.2 Тут уже не совсем понял... для команды FIND указан такой синтаксис (примерно):FIND [параметры] "строка" [файл] в данном случае когда команда получает ввод из файла pass.txt, то этот файл как бы становится аргументом для этой команды? то есть как бы и попадает в конец и в итоге синтаксис не нарушен? Или это прокатывает с любой командой для которой нужно указывать файл, и не важно в каком месте в команде он должен быть указан? В общем, я вроде бы понял как это работает, но не понял почему это работает... Вопрос 3.3 Так же зметил что если спользовать find /n /v "" pass.txt , т.е. в таком виде как указано в справке, то получаем такой вывод: ---------- PASS.TXT [1]d:\наши распаковки [2]2020 [3]архивы т.е. дополнительные две ненужные нам строки - пустую и "---------- PASS.TXT" Вопрос: именно поэтому Вы использовали <"pass.txt" ??? Вопрос: можно было бы использовать команду ('find /n /v "pass.txt"') но добавить ключ skip=2 для цикла, правильно??? Вопрос 4 Тут уже не конкретно об этом примере, а в целом о циклах. При каких конструкциях появляются дополнительные переменные? Я правильно понял, что дополнительные переменные появляются только при использовании FOR с ключом /F, и когда задействован ключ tokens= ??? В справке написано так:tokens=x,y,m-n - номера подстрок из каждой строки, передаваемые в тело цикла "for" для каждой итерации... При использовании этого ключа выделяются дополнительные имена переменных. Просто больше нигде не попадалось явного указания о появлении дополнительных переменных. Единственное попался еще вот такой пример на киберфоруме:FOR /F %%a in ("Каждое слово в отдельную переменную") DO echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e тут ключ tokens= не прописан... Не пойму Добавлено: Там же, на киберфоруме:В отличие, от FOR без ключа, в FOR /F все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла. Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке*, начиная с буквы, заданной после FOR /F %% т.е. при FOR /F в принципе всегда будет несколько переменных? кроме случаев когда задан ключ "delims=" (или "tokens=*") ??? Но тогда снова сбивает с толку вот это примечание (указано там же, чуть ниже):Обратите внимание: по умолчанию, цикл выдаёт в результатах только 1-ый токен. Если вам нужно, получить другой, нужно явно указывать модификатор "tokens=xxx". Или тут имеется ввиду что в первую переменную попадет всегда первый токен??? потому что в их же примере, который выше (который "Каждое слово в отдельную переменную"), не задан ключ "tokens=xxx") и тем не менее все токены раскидались по переменным... Боюсь, скоро сломаю мозг
|
wadimus
- Стаж: 8 лет
- Сообщений: 749
- Репутация:91[+] [-]
|
cartmenezz, вопрос1 батник:set t=<тут будут разные строки> for /f "tokens=%t%" %%a in ("Desktop REG_SZ C:\Users\Вася Иванович Петров\Desktop") do ( set w1=%%~a set w2=%%~b set w3=%%~c set w4=%%~d set w5=%%~e ) и будем подставлять такие строки в переменную t:set t=1,2,3,4* set t=1,2,3,4 set t=1,2,3 set t=1,2,3* set t=1,2* set t=2* set t=1* set t=1 set t=1,3 по алфавиту порядок переменных: a b c d e f .. если в переменной a (или к примеру c) определилось какое-то значение, то по алфавиту в следующей переменной b (или следующая буква за c - это d) будет значение по следующему токену (если в токенах есть символ * или следующее перечисление: 2,3 или 3,4 или так: 2,4) Добавлено через 19 минут 19 секунд: Вопрос2 различия в "tokens=3*" и "tokens=3" в переменной a получилось значение по 3-му токену: tokens=3* - до следующего значения по токену (и будет задействована следующая по алфавиту переменная b, в которую попадет следующее значение и до конца строки) tokens=3 - до следующего значения по токену (и следующей по алфавиту переменной b нет,она неопределена)
|
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, о это я знаю)) 1й - кроме разделителей (отрежет сначала и с конца) 2й вариант - даст всю строку Добавлено через 4 минуты 18 секунд: wadimus, Ответ 1 - прогнал батник со всеми вариантами, в принципе все понятно, закрепил результат) Ответ 2 - тут по идее тоже понятно, я то в принципе понимал что tokens=3 и tokens=3* это не одно и то же, просто там далее переменную %%b мы никак не использовали, поэтому разницы бы не было.. Думаю тут я все понял, спасибо Добавлено через 10 минут 34 секунды: Ander_73, всё-таки ошибся , 1й вариант отрежет только разделитель в начале строки (если он там есть)
|
Страница 29 из 94
Текущее время: 26-Ноя 06:32
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|