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

    asteroid7
  • 27330
  • Стаж: 3 года 1 месяц
  • Сообщений: 26
  • Репутация:3

    [+] [-]
85632
㡨㠴㕨㜴
что за дичь такая?)) интересненько))
Да, странная штука.
Можно так в ярлыке прописать C:\Windows\NIRCMD.EXE clipboard set "h848h547"
если в систему добавить утилиту nircmd.
Так всё хорошо работает и без переноса строки.

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

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

    [+] [-]
  • Откуда: Калининград
asteroid7, спасибо за подсказку, просто не хотелось прибегать к сторонним утилитам (у меня к тому же создание таких ярлыков немножко автоматизировано, а на nircmd вроде АВ бывают ругаются)
случай, мягко говоря, исключительный, вероятность попасть на него была микроскопической (предполагаю), так что я пока просто убрал последний символ, и после выставки дописываю 7ку... не смертельно... просто интересно было, что же это

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

    Gemostarter
  • 15956
  • Стаж: 7 лет 1 месяц
  • Сообщений: 324
  • Репутация:35

    [+] [-]
cartmenezz, Это старая, как мир, проблема с кодировками в буфере обмена. Программа помещает в буфер набор байтов, но не говорит винде, на каком они языке и в какой кодировке, та пытается угадать, используя текущую локаль, активный язык ввода и т.д., но получается не всегда.
Попробуйте вместо "echo|set" использовать "< nul set".

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

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

    [+] [-]
  • Откуда: Калининград
85680проблема с кодировками в буфере обмена
понял, спасибо
85680< nul set
к сожалению, результат тот же
....
поправочка, "<nul set /p x=h848h547| Clip" - все норм)) еще раз спасибо
...
поправочка2, пробел в конце добавляется (если текст взять в кавычки - снова иероглифы)... жаль... ну да ладно

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

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

    [+] [-]
  • Откуда: Калининград
Только заметил, при использовании команды type есть странная штука:
type %file%
echo.
echo ANY_TEXT
"echo." в данном случае не дает пустой строки м/у содержимым файла %file% и строкой "ANY_TEXT".
Сначала не мог врубиться, ведь до этого уже выводил так сгенерированные списки и промежуток был.
Оказалось, что в тех списках просто была в конце пустая строка. Обычно я добавляю ее в конце (привычка), а в этот раз ее там не было, вот и заметил.
Попробовал ради интереса заменить "echo." на "echo 1111" - единицы прописались в конец последней строки файла.
Получается, что при использовании команды "type" в конце не происходит перевода на новую строку?
Теперь видимо остается два варианта:
1) оставить как есть -- и при отсутствии пустой строки в конце файла следующий текст "сольется"
2) добавить еще одну "echo." -- тогда если в конце файла будет пустая строка, то отобразится одна лишняя
...
никакой эстеки! а хочется однообразия - чтобы всегда отображалось одинаково... печалька
...
можно, конечно, еще как-то так:
for /f "useback" %%a in ("%file%") do echo %%a
echo.
echo ANY_TEXT
так поидее всегда будет одна пустая строка, даже если их было несколько..
Для команды type нельзя как-то блокировать вывод пустых строк? искал, но не нашел никаких параметров
+++++++++++
Ander_73 aa
как бы вы поступили в такой ситуации:
у меня выбор файла происходит с помощью утилиты FileToOpen:
for /f "delims=" %%a in ('FileToOpen "set file=" "%~d0\*.txt;*.ini;*.cfg" "SELECT FILE"') do %%a
в итоге я получаю в переменной %file% полный путь к файлу, уже с кавычками.
а руки так и тянутся писать "%file%", да и например в вышеупомянутую конструкцию придется писать так:
for /f "useback" %%a in (%file%) do echo %%a
тоесть указываю "useback", чтобы можно было имя файла в наборе заключить в кавычки, но кавычек до раскрытия переменной не видно..
смотрится странно и руки тянутся поправить, если не держать в уме, что FileToOpen уже заключил имя в кавычки..
Просто, еще чего опасаюсь, память у меня девичья, спустя время если буду анализировать то, что сам же понаписал - сходу не пойму почему кавычки не указал.
Можно конечно комментарий добавить..
собственно вопрос:
правильно ли будет переписать значение переменной, убрав кавычки?
так:
set "file=%file:~1,-1%"
или так:
set "file=%file:"=%"
с одной строны - дальше можно будет писать более привычное "%file%", с другой - лишняя строка в батнике (а их итак многовато).
Интересно, как бы поступил специалист на опыте)

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

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

    [+] [-]
85718как бы вы поступили в такой ситуации:
Я бы прочитал хелп:
/noquote Returned file path(s) will not be enclosed in quote marks.

Добавлено через 2 минуты:
85718Получается, что при использовании команды "type" в конце не происходит перевода на новую строку?
Команда ничего не выводит "от себя". Если в конце файла нет перевода строки, значит юзеру так надо и нечего за него додумывать (говорит себе type и не переводит каретку).
ab

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

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

    [+] [-]
  • Откуда: Калининград
85720Я бы прочитал хелп:
вот жешь.. ну ничего, однажды я это сделаю!))
85720Команда ничего не выводит "от себя"
наверное в этом есть смысл... тогда, пожалуй, оставлю вывод через цикл и echo, так как списки делать буду не я, а type додумывать не хочет
Большое спасибо за помощь
PS:
"for /f "useback" %%a in ("%file%") do echo %%a" будет сильно проигрывать "type "%file%"" по скорости, и будет ли вообще? возможно на больших файлах?
В данном случае больших списков не будет, но интересно, чисто для справки, на будущее


Последний раз редактировалось: cartmenezz (2021-05-22 10:04), всего редактировалось 1 раз

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

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

    [+] [-]
cartmenezz, мне не вполне понятна задача, которую ты возлагаешь на type, но можно вот так:
<%file% find /v ""
Каретка переводится всегда!

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

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

    [+] [-]
  • Откуда: Калининград
85723мне не вполне понятна задача
да ничего особенного, просто предварительный вывод на экран строк из текстового файла (конфига), в данном случае небольшого строк 40 максимум). так что, в конкретном случае конечно разницу в скорости работы не заметить, наверное.
просто думал, раз уж команда "type" узконаправленная конкретно для этой задачи, то наверное шустрее.
... в общем, чисто из любопытства (вечером наверное найду какой-нибудь файлик на несколько мегабайт и сравню с таймером)
85723можно вот так
Благодарствую, пригодится

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

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

    [+] [-]
cartmenezz, ты учти, что при выводе через for пропускаются все пустые строки. Если их и так нет, то неважно, а если есть и надо сохранить исходный вид файла, то ой.

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

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

    [+] [-]
  • Откуда: Калининград
Ander_73, это я понимаю, и как раз в данном случае - это то что надо. Файл все равно предполагается обрабатывать командой for (выполнять конды над списком пакетов), предварительный вывод нужен для самопроверки
Добавлено через 1 час 10 минут 22 секунды:
может конечно никому кроме меня и не будет интересно, но решил поделиться результатами тестирования скорости чтения. прогнал два разных больших текстовых файла:

через TYPE

@echo off
set tm1=%TIME%
echo.
pause
cls
type 1.txt
echo.
echo TYPE RESULT:
echo start = %tm1%
echo   end = %TIME%
echo.
pause

через FIND

@echo off
set tm1=%TIME%
echo.
pause
cls
<1.txt find /v ""
echo.
echo FIND RESULT:
echo start = %tm1%
echo   end = %TIME%
echo.
pause

через FOR

@echo off
set tm1=%TIME%
echo.
pause
cls
for /f "delims=" %%a in (1.txt) do echo %%a
echo.
echo FOR RESULT:
echo start = %tm1%
echo   end = %TIME%
echo.
pause

результаты

------ file_1 ------
TYPE RESULT:
start = 10:21:22,85
end = 10:21:42,87
(~20sec)
FIND RESULT:
start = 10:23:05,25
end = 10:23:31,42
(~26sec)
FOR RESULT:
start = 10:24:06,01
end = 10:24:43,48
(~37sec)
------ file_2 ------
TYPE RESULT:
start = 10:25:39,38
end = 10:26:21,47
(~42sec)
FIND RESULT:
start = 10:26:46,23
end = 10:27:28,75
(~42sec)
FOR RESULT:
start = 10:27:47,80
end = 10:28:15,48
(~28sec)
видимо на скорость обработки "FOR" существенно влияет содержимое файла

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

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

    [+] [-]
  • Откуда: Калининград
сгенировал ещё один тестовый файл, уже прям нужного содержания (список имен, длиной 18-40 символов) и прям большой - получилось 3.899.313 строк (102Мб)

результаты

TYPE RESULT:
start = 12:39:31,70
end = 12:43:59,42
(~268sec)
FIND RESULT:
start = 12:56:53,19
end = 13:02:58,86
(~365sec)
FOR RESULT:
start = 14:17:32,46
end = 14:32:15,17
(~883sec)

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

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

    [+] [-]
  • Откуда: Калининград
Ander_73, Здравствуйте aa
нет ли какой хитрости, чтобы в конструкции FOR /F задать сразу несколько символов обозначения комментария (eol) ?
Добавлено через 19 минут 43 секунды:
вроде что-то получилось
было так:
for /f "useback" %%a in ("%list_file%") do echo %%a
теперь так:
for /f %%a in ('findstr /b /v /i "; # /" "%list_file%"') do echo %%a
* хотя ";" наверное можно не указывать, он итак учитывается (как стандартный eol)
надо только потестировать
Добавлено через 28 минут 57 секунд:
есть конечно минус, если случайно пропустить пробел перед символом (# или /) то строка уже не будет пропущена (в отличие от eol)

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

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

    [+] [-]
cartmenezz, если саму строку парсить не надо, то напиши прям так:
for /f "usebackq tokens=1 delims=;#/" %%a in ("%list_file%") do echo %%a

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

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

    [+] [-]
  • Откуда: Калининград
Ander_73, так обрабатываются даже те строки, где никаких пробелов в начале нет - выводится все что после этих знаков, а мне то нужно пропустить такие строки
.. ну тоесть не все выводится, но попытка есть)) а если в начале строки пробел, то получаем "Режим вывода команд на экран (ECHO) отключен."
накидал тестовый файл для обработки:
; -------------------------------------------------------------
; КОММЕНТАРИЙ
; КОММЕНТАРИЙ
; -------------------------------------------------------------
;
;1
;;2
; 3
;; 4
#
#5
##6
# 7
## 8
;
;9
;;10
; 11
;; 12
#
#13
##14
# 15
## 16
  ;
  ;17
  ;;18
  ; 19
  ;; 20
  #
  #21
  ##22
  # 23
  ## 24
после for /f %%a in ('findstr /b /v /i "# /" "%list_file%"') do echo %%a получаю:
#
#13
##14
#
##
#
#21
##22
#
##
т.е. проблемы только там где "просмотрел" пробел(ы) в начале строки
после for /f "usebackq tokens=1 delims=;#/" %%a in ("%list_file%") do echo %%a получаю:
-------------------------------------------------------------
╩╬╠╠┼═╥└╨╚╔
╩╬╠╠┼═╥└╨╚╔
-------------------------------------------------------------
1
2
3
4
5
6
7
8
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
выглядит чуть лучше, если заменить на "tokens=*", но в любом случае это не то, надо эти строки совсем исключить...
В принципе, проблема возможно надумана - просто не надо пробелы оставлять в начале строки... просто интересно было бы победить
Добавлено через 2 минуты 49 секунд:
жаль нельзя для FINDSTR помимо параметра /B добавить еще один, чтобы искать в начале строки, но при этом чтобы за начало строки воспринимался первый символ непробел
Добавлено через 4 минуты 51 секунда:
наверное единственный вариант прогнать содержимое файла через цикл FOR /F с параметром tokens=* - чтобы отсеить начальные и концевые пробелы, а потом снова обработать через цикл for /f %%a in ('findstr /b /v /i "# /" "%list_file%"') ... только я пока не дорос до того чтобы цикл вложить в цикл, даже когда смотрю на готовые примеры у меня мозг начинает кипеть)) но я попытаюсь))
Добавлено через 1 минута 1 секунда:
вот так вроде работает, все лишнее отсеивает:
for /f "useback tokens=*" %%a in ("%list_file%") do (
for /f %%A in ('echo %%a^| findstr /b /v /i "# /"') do echo %%A
)
только ощутимо медленнее...
Добавлено через 34 минуты 47 секунд:
прям НАМНООООГОО медленнее:

ВИДЕО


Страница 49 из 89


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

Текущее время: 06-Май 10:13

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


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