[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 2 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, понял, благодарю. А ваше мнение, вариант 3 ???

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 9 месяцев
  • Сообщений: 3821
  • Репутация:127

    [+] [-]
cartmenezz, вариант номер 3 у меня используется везде. Только скобки там не нужны ab

[Цитировать]

    korsak7
  • 107
  • Стаж: 9 лет
  • Сообщений: 1063
  • Репутация:62

    [+] [-]
78388korsak7, sergeysvirid, Благодарю за помощь.
783855 вариант сразу в топку
это потому что папка Program Files (x86) может и ошибочно присутствовать (из-за какого-нибудь кривого репака, самой сборки винды,..) ???
именно так. поэтому варианты с проверкой наличия-отсутсвия файлов-папок ненадежны

[Цитировать]

    sergeysvirid
  • 104
  • Стаж: 9 лет
  • Сообщений: 2582
  • Репутация:127

    [+] [-]
  • Откуда: 65 регион (GMT+11)
78388на сто процентов не уверен, но как я понял, %PROCESSOR_ARCHITECTURE% не определяет тип процессора, а определяет тип процесса.
Ну да, наверное так и есть. Видимо я сам малёха тут "затупил" ah bm


Последний раз редактировалось: sergeysvirid (2020-06-15 12:50), всего редактировалось 1 раз

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 2 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, korsak7, sergeysvirid, ещё раз спасибо всем за помощь az

[Цитировать]

    wadimus
  • 14910
  • Стаж: 8 лет
  • Сообщений: 749
  • Репутация:91

    [+] [-]
ну, наконец-то разбанили меня :) af
ща всё выложу bb
cartmenezz, моё видЕние (или вИдение) решения проблемы сборника архивов:
отдельная папка (к примеру Utils), в ней нужные файлы для распаковки:
7z.exe + 7z.dll
два текстовых файла:
where.txt - куда распаковывать архивы (в одну строчку!) типа:
D:\моя папка для моих программ
pass.txt - пароль архива (в одну строку!) типа:
2020
отдельно рядом с папкой 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
  • 15549
  • Стаж: 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
  • 14910
  • Стаж: 8 лет
  • Сообщений: 749
  • Репутация:91

    [+] [-]
Ander_73, дык, старая заповедь программиста: работает? не переделывай!

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 2 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
wadimus aa
еще раз огромнейшее спасибо за доведение до ума, теперь прям красота))
78415
for /f "tokens=2*" %%a in (
'reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop') do set w=%%~b
А тут так и надо, то что a превратилась в b ? как я уже упоминал чуть выше, с командой FOR я "на Вы", но вдруг все-таки опечатка

[Цитировать]

    wadimus
  • 14910
  • Стаж: 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 query
reg 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
сумбурно как-то ah
Добавлено через 24 минуты 14 секунд:
ЗЫ. как добавка ..
из текстового файла pass.txt читаем только первую строку:
Set /p p=<"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%

Комментарий от sergeysvirid


Спасибо за подробные комментарии к примерам!

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 2 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
wadimus, не скажу что все сразу понял, но буду перечитывать пока не пойму)) спасибо, полезная информация

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 2 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
wadimus, еще раз Здравствуйте aa
Жара наконец немного спала, мозг заработал.. Почитал про циклы, все что нашел. Решил разобраться в том что вы написали, разложить для себя по полочкам, так сказать.
Если Вас (или еще кого-нибудь знающего) не затруднит - проверьте мои выводы, поправьте где ошибаюсь.
Вопрос 1
78428
for /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
    • 14910
    • Стаж: 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 нет,она неопределена)

    [Цитировать]

      Ander_73
    • 15549
    • Стаж: 7 лет 9 месяцев
    • Сообщений: 3821
    • Репутация:127

      [+] [-]
    Камрады, я вам подкину для задору ab
    В чём разница, между:
    for /f "tokens=*" %%i ...
    и
    for /f "delims=" %%i ...
    Минут пошла!
    ag

    [Цитировать]

      cartmenezz
    • 1384
    • Стаж: 9 лет 2 месяца
    • Сообщений: 527
    • Репутация:14

      [+] [-]
    • Откуда: Калининград
    Ander_73, о это я знаю))
    1й - кроме разделителей (отрежет сначала и с конца)
    2й вариант - даст всю строку
    af
    Добавлено через 4 минуты 18 секунд:
    wadimus,
    Ответ 1 - прогнал батник со всеми вариантами, в принципе все понятно, закрепил результат)
    Ответ 2 - тут по идее тоже понятно, я то в принципе понимал что tokens=3 и tokens=3* это не одно и то же, просто там далее переменную %%b мы никак не использовали, поэтому разницы бы не было.. Думаю тут я все понял, спасибо
    Добавлено через 10 минут 34 секунды:
    Ander_73, всё-таки ошибся an , 1й вариант отрежет только разделитель в начале строки (если он там есть)

    Страница 29 из 94


    Показать сообщения:    

    Текущее время: 26-Ноя 07:00

    Часовой пояс: UTC + 3


    Вы не можете начинать темы
    Вы не можете отвечать на сообщения
    Вы не можете редактировать свои сообщения
    Вы не можете удалять свои сообщения
    Вы не можете голосовать в опросах
    Вы не можете прикреплять файлы к сообщениям
    Вы можете скачивать файлы