• Как лучше всего хранить многострочный текст в .cmd или .bat файле?

    wisgest
    @wisgest
    Не ИТ-специалист
    Вкратце (возможно, когда-нибудь дополню ответ, если вспомню какие либо тонкости и соберусь с силами).

    Чтобы разбить команду на несколько строк надо в конце каждой строки добавить символ ^. Если после него будет идти пустая строка, то в команду будет вставлен перевод строки.

    Пример.
    echo ^
    Hello,^
    
        world!

    выведет
    Hello,
        world!

    Если использовать отложенное раскрытие переменных, то можно вывести текст, сохранённый в переменной:
    setlocal enabledelayedexpansion
    set A=^
    Hello,^
    
      world!
    echo !A!

    В тексте надо удваивать знаки процента, экранировать символом ^ специальные символы (его самого, символы перенаправления, соединения команд, закрывающую скобку (внутри составных команд), желательно, кавычку…), дважды экранировать восклицательные знаки при отложенном раскрытии переменных, если текст между ними может быть воспринят как имя переменной… В общем, упражняйтесь.

    Ещё можете посмотреть тему CMD/BAT: Возможность создания heredoc. Также, например, в теме CMD/BAT: Пакетные макросы с параметрами рассматривается создание переменных (CR и LF), содержащих символы перевода строки и возврата каретки:
    spoiler
    :: Определяет переменную ВОЗВРАТ КАРЕТКИ (используется как !CR!)
    for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
    
    :: Определяет переменную ПЕРЕВОД СТРОКИ (используется как !LF!)
    set LF=^
    
    
    :: Две пустые строки сверху важны - не удалять!
    Ответ написан
    Комментировать
  • Как обрезать массив с обеих сторон в AHK?

    wisgest
    @wisgest
    Не ИТ-специалист
    И что сложного в этом общеалгоритмическом вопросе: вы не можете в цикле пройтись по массиву, вам на каждый чих нужна особая функция?

    Ну, вызовите тогда для массива дважды метод RemoveAt (для удаления с конца при этом, вероятно, ещё потребуется использовать метод Length).

    Изучайте документацию: www.autohotkey.com/docs/v1/lib/Object.htm
    Ответ написан
    Комментировать
  • Как сделать ссылку внутри SVG файла на какой-либо объект?

    wisgest
    @wisgest
    Не ИТ-специалист
    Вставлять классическим способом — тегом <object/>.
    Ответ написан
    Комментировать
  • Как возвратить курсор на 2 символа назад в консоли?

    wisgest
    @wisgest
    Не ИТ-специалист
    Дважды вывести в консоль управляющий символ «Забой» («Backspace») с кодом 8 (Ctrl-H). Как это сделать зависит от используемого языка программирования. В Си-подобных языках может быть задан в строковом литерале последовательностями \b или \x08.
    Ответ написан
    Комментировать
  • Как исправить странные символы вместо русских букв в путях при выполнении командного файла?

    wisgest
    @wisgest
    Не ИТ-специалист
    Ваш командный файл был сохранён в кодировке UTF-8. Пересохраните его в кодировке DOS/OEM (для русской Windows — это cp866) или в начале самого командного файла с помощью команды chcp включите в консоли кодовую страницу кодировки, в которой он сохранён; для UTF-8 — 65001:
    chcp 65001
    (но в ранних выпусках cmd для Windows, по крайней мере до XP включительно, UTF-8 в командных файлах плохо поддерживалась).

    (Также можно кодовую страницу по умолчанию для консольных приложений, например, в данном случае cmd.exe, задать в реестре…)
    Ответ написан
    Комментировать
  • Как динамически обновлять дочернее окно?

    wisgest
    @wisgest
    Не ИТ-специалист
    при каждом новом обращении к y.document.write() он не перезаписывает а дозаписывает

    Закройте документ после document.write():
    y.document.close(),
    или, наоборот, откройте перед перезаписыванием:
    y.document.open().
    Ответ написан
    Комментировать
  • Как удалить переносы строк в файле?

    wisgest
    @wisgest
    Не ИТ-специалист
    Echo !St!>>"%NewFileName%" в любом случае вставляет перевод после выводимой строки. Чтобы этого не происходило, можно вместо echo использовать set /p с вводом из пустого устройства (forum.script-coding.com/viewtopic.php?id=2945):
    set /p =!St!<nul >>"%NewFileName%"
    Ответ написан
    Комментировать
  • Почему ругается на знак |?

    wisgest
    @wisgest
    Не ИТ-специалист
    Перед этим знаком стоит синтаксически незавершённая команда
    for /f "usebackq" %%a in (`echo %%h %%i
    так как, если так можно выразиться, приоритет этого знака выше чем у знака ` (но, например, ниже чем у неэкранированного знака ").
    Чтобы знак | стал частью команды, а не её ограничителем, его необходимо экранировать знаком ^.
    Ответ написан
    5 комментариев
  • Почему в батник не берет элементы из переменной?

    wisgest
    @wisgest
    Не ИТ-специалист
    Теоретическое обоснование и разбор всех случаев писать лень (возможно, когда-нибудь перепишу и дополню ответ).

    У вас точно не работает двукратное раскрытие переменных
    set "randomFile=!pyti_k_15_perebivkam[!randomIndex!]!"

    Не перепроверял, но попробуйте взамен
    call set "randomFile=!pyti_k_15_perebivkam[%%randomIndex%%]!"

    и поищите сведения об использовании команды call для отложенного раскрытия переменных, при котором могут быть свои трудности.
    Ответ написан
    Комментировать
  • Почему замена строк местами не работает на большом документе?

    wisgest
    @wisgest
    Не ИТ-специалист
    (Не очень понятно, в чём состоит «открытие файла на чтение»: по моему, просто присваивается значение одной переменной другой.)

    Вероятно, не хватает памяти для переменных окружения.
    Можно не запоминать все строки, а прочитать три первых, вывести их в нужном порядке, а затем выводить строки, не запоминая их, в новый файл и удалить старый.

    Первые три строки можно получить так:
    (
    set /p "s1="
    set /p "s2="
    set /p "s3="
    ) <input.txt

    Вывести содержимое файла, начиная с четвёртой строки можно, например, с помощью утилиты more:
    more +3 input.txt >>output.txt
    или
    more +3 <input.txt >>output.txt

    А в целом:
    (
    set /p "s1="
    set /p "s2="
    set /p "s3="
    echo !s3!
    echo !s2!
    echo !s1!
    more
    ) <input.txt >output.txt
    del input.txt
    ren output.txt input.txt

    В этом случае, возможно, вместо
    more
    для перехвата оставшихся строк будет лучше
    find /v ""
    Ответ написан
    3 комментария
  • Как убить процесс в названии коротого пробелы использую командную строку?

    wisgest
    @wisgest
    Не ИТ-специалист
    Как и во многих других случаях аргументов с пробелами использовать кавычки:
    taskkill /im "name with spaces.exe"
    Ответ написан
    Комментировать
  • Как переименовать все файлы в нижний регистр с помощью cmd?

    wisgest
    @wisgest
    Не ИТ-специалист
    Уточнение про NTFS и FAT32 (добавлено 2022-12-26)
    Условный
    for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

    поэтому не срабатывает.

    Если бы это совсем не срабатывало, то вряд ли было бы выбрано лучшим ответом на соответствующий вопрос на Super User. У меня это срабатывает на NTFS, а вот на FAT32 (проверялось на съёмном USB-накопителе) — нет. Более того, на FAT32, если имя файла укладывается в формат 8.3, при попытке переименования (не обязательно с помощью CMD.EXE, можно и в Проводнике…), меняющем только регистр символов, все символы переводятся в верхний регистр!

    Вручную приходится делать Abc.jpg -> 1Abc.jpg -> abc.jpg

    Так что мешает делать это не вручную?
    Например, в теле цикла
    (ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")
    При этом, правда, будут впустую переименовываться туда-сюда файлы с именами уже в нижнем регистре. Чтобы этого избежать можно добавить перед телом цикла проверку for %g in ("%~nxf") do if not "%f"==%g:
    for /f "delims=" %f in ('dir /l/b/a-d') do  for %g in ("%~nxf") do  if not "%f"==%g  (ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")

    Прежний совет (до правки 2022-12-25)
    …Чтобы этого избежать можно сделать в командном файле так:
    for /f "delims=" %%f in ('dir /l/b/a-d') do  for %%g in ("%%f*") do (
    	if /i "%%f"=="%%g"  if not "%%f"=="%%g" (
    		ren "%%f" "to_lower_%%f" && ren "to_lower_%%f" "%%f"
    	)
    )

    И ещё: если обрабатываемая папка открыта в Проводнике, то, скорее всего (наблюдалось в случае NTFS), чтобы увидеть изменение регистра имён файлов, надо будет обновить содержимое окна.
    Ответ написан
  • Переменные ахк [AHK] | Как сделать так что бы человек мог сам ставить бинд через ini файл?

    wisgest
    @wisgest
    Не ИТ-специалист
    Не знаю, что такое «бинд».
    Используйте команду Hotkey:
    Ответ написан
    Комментировать
  • Как массово переименовать файлы по порядку?

    wisgest
    @wisgest
    Не ИТ-специалист
    Переименование файлов в текущем каталоге будет выглядеть так:
    setlocal enableextensions enabledelayedexpansion
    set /a "num = 0"
    for %%I in (*.jpg) do (
    	set /a "num += 1"
    	ren "%%~I" !num!.ren_jpg
    )
    ren *.ren_jpg *.jpg
    endlocal
    Ответ написан
  • Не могу понять, в чем ошибка?

    wisgest
    @wisgest
    Не ИТ-специалист
    еще в основном файле какие-то странные иероглифы

    Совершенно очевидно, что файл index.js сохранён в UTF-16. Пересохраните его в UTF-8 или укажете действительную кодировку в атрибуте charset тега <script/> или в HTTP-заголовке Content-Type, с которым отдаётся файл.
    Ответ написан
    Комментировать
  • Как в bat файле удалить текущую директорию?

    wisgest
    @wisgest
    Не ИТ-специалист
    Что значит
    RD %cd% не удаляет
    ? — Должно же быть какое-то сообщение об ошибке, которое нужно привести в вопросе.

    Если в каталоге есть открытые файлы, он занят какими либо процессами или недостаточно прав для удаления каталога или файлов в нём, то естественно не удалит.

    Чтобы каталог не был занят самим процессом cmd.exe перейдите в надкаталог и удалите прежний рабочий каталог:
    for %%D in (.) do (cd ..& rd "%%~fD")
    или, если переменная среды CD не определена, используйте одноимённую псевдопеременную:
    cd ..& rd "%CD%"
    В обоих случаях требуется расширенная обработка команд (по умолчанию включена). Команда RD скорее всего потребует дополнительные ключи (/S и /Q).

    Следует заметить, что если сам командный файл находится в удаляемом каталоге, то после выполнения текущей команды (возможно, составной) последующие команды выполнены не будут, так как командные файлы в память целиком не считываются.
    Ответ написан
    Комментировать
  • Нужна ли директива rewritecond в .htaccess при переносе сайта на другой домен?

    wisgest
    @wisgest
    Не ИТ-специалист
    Условие (RewriteCond) нужно, если изменилось только доменное имя, но сайт остался на том же месте и просто стал обслуживать запросы по ещё одному доменному имени, иначе получится порочный круг перенаправлений (на себя будут перенаправлены и запросы к новому имени). Если для старого имени выделить отдельный хост, то перенаправление надо будет настроить только на нём и его можно будет сделать уже безусловным (и будет проще сделать при помощи Redirect, а не RewriteRule).
    Ответ написан
    Комментировать
  • Как присвоить переменной значение последовательности команд?

    wisgest
    @wisgest
    Не ИТ-специалист
    1-й способ) Перенаправить вывод команды в файл и ввести переменную из этого файла:
    tasklist /fi "IMAGENAME eq vlc.exe" | find /c /i "vlc.exe">file.tmp
    set /p "VAR="<file.tmp
    del file.tmp

    2-й способ) Обработать в цикле с ключом /f вывод команды:
    for /f %%V in ('tasklist /fi "IMAGENAME eq vlc.exe" ^| find /c /i "vlc.exe"') do  set "VAR=%%V"

    (При этом не придётся создавать вспомогательный файл, но для выполнения команды будет запускаться дополнительный процесс cmd.exe.)
    Ответ написан
    2 комментария
  • Какая сложность у такого цикла for?

    wisgest
    @wisgest
    Не ИТ-специалист
    Да. Цикл выполнится столько раз, сколько значащих двоичных цифр в N. Количество цифр в записи натурального числа N без возможных незначащих ведущих нулей приблизительно равно его логарифму (целая часть логарифма N+1 по основанию системы счисления).
    Ответ написан
    Комментировать