Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] убрать точку в цикле из расширения файла (http://forum.oszone.net/showthread.php?t=342300)

shadowbat 22-09-2019 21:59 2889133

убрать точку в цикле из расширения файла
 
есть код
Код:

for %%i in ("%CD%\*.txt") do (
echo %%~nxi
)
pause

нужно, чтобы вместо "name.txt" выводились "name-txt" или "name txt"

этот код работает только с setlocal EnableDelayedExpansion
Код:

for %%i in ("%CD%\*.txt") do (
echo %%~xi
set "qqn=%%~ni"
set "qqx=%%~xi"
setlocal EnableDelayedExpansion
echo !qqn!!qqx!
echo !qqx:.=-!
echo !qqx:~1,3!
set qq1=!qqx:.=-!
set qq2=!qqx:~1,3!
echo !qq1!
echo !qq2!
set qq3=!qqn!!qq1!
set qq4=!qqn! !qq2!
echo !qq3!
echo !qq4!
set qq5=!qqn!!qqx:.=-!
set qq6=!qqn! !qqx:~1,3!
echo !qq5!
echo !qq6!
endlocal
)
pause

какие еще есть варианты, только без EnableDelayedExpansion ? и без goto

alpap 22-09-2019 23:13 2889142

Код:

dir /b "*-txt" "* txt"

greg zakharov 22-09-2019 23:29 2889146

Силами cmd:
Код:

cmd /v/c "for %%i in ("%cd%\*.txt") do @(set "n=%%~ni" & set "x=%%~xi" & echo:!n! !x:.=!)"
Силами cmd+sed:
Код:

dir /b *.txt | sed "s/\./ /g"
Силами pwsh:
Код:

(gci *.txt).Name -replace '\.', ' '

megaloman 23-09-2019 14:52 2889230

shadowbat, Без восклицаний:
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do (
                Set "Ext=%%~xi"
                Call Echo "%%~ni-%%Ext:~1%%"
        )
Exit /B

А зачем это нужно, имхо в цикле Вы с этими именами что-то делать хотите, а не наслаждаться их видом в Echo ...
Более универсальный путь
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do Set "Ext=%%~xi" &Call :NewName "%%i" "%%~ni" "%%Ext:~1%%"
Exit /B

:NewName
        Set "NN=%~2-%~3"
        Echo %NN%
Exit /B 0

убрать точку в цикле из разрешсширения файла

shadowbat 24-09-2019 13:03 2889364

Цитата:

Цитата alpap
dir /b "*-txt" "* txt" »

не понял
имеется ввиду так?
Код:

for %%i in ("%CD%\*.txt") do (
dir /b "*-txt"
dir /b "* txt"
)
pause


Цитата:

Цитата greg zakharov
Код:

cmd /v/c "for %%i in ("%cd%\*.txt") do @(set "n=%%~ni" & set "x=%%~xi" & echo:!n! !x:.=!)"

не заводится
переменные !n! !x:.=! как раз и работают только в случае с EnableDelayedExpansion, нет? аналогичный этому код как раз и показан в первом посте
окно выдаёт:
Скрытый текст
Код:

D:\111>for %i in ("D:\111\*.txt") do (cmd /v/c "for %i in ("D:\111\*.txt") do @(set "n=%~ni" & set "x=%~xi" & echo:!n! !x:.=!)" )

D:\111>(cmd /v/c "for D:\111\log 2.txt in ("D:\111\*.txt") do @(set "n=log 2" & set "x=.txt" & echo:!n! !x:.=!)" )
Непредвиденное появление: D:\111\log.

D:\111>(cmd /v/c "for D:\111\log.txt in ("D:\111\*.txt") do @(set "n=log" & set "x=.txt" & echo:!n! !x:.=!)" )
Непредвиденное появление: D:\111\log.txt.

D:\111>pause
Для продолжения нажмите любую клавишу . . .



Цитата:

Цитата megaloman
@Echo Off
For %%i in ("%CD%\*.txt") Do (
Set "Ext=%%~xi"
Call Echo "%%~ni-%%Ext:~1%%"
)
Exit /B

хм, а так не работает:
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do (
                Set "Ext=%%~xi"
                Call Echo "%%~ni-%%Ext:~1%%"
                Set Ext2="%%~ni_%%Ext:~1%%"
                Call Echo %Ext2%
        )
pause
Exit /B

Цитата:

А зачем это нужно, имхо в цикле Вы с этими именами что-то делать хотите, а не наслаждаться их видом в Echo ...
да банально скопировать файл file.txt в \file-txt\file.txt чтобы лишний раз не дублировать точку в имени папки. а %%~xi выдаёт значение с точкой а без точки не выдаёт

Цитата:

из разрешсширения файла
благодарю, поменял

Iska 24-09-2019 13:18 2889365

Цитата:

Цитата shadowbat
не заводится
переменные !n! !x:.=! как раз и работают только в случае с EnableDelayedExpansion, нет? »

Цитата:

Цитата shadowbat
окно выдаёт: »

Заводится. Параметр /v интерпретатора команд как раз включает отложенное раскрытие переменных окружения на указанный сеанс его работы:
Цитата:

Цитата cmd.exe /?
Код:


/V:ON  Разрешение отложенного расширения переменных среды с применением
        символа '!' в качестве разделителя. Например, /V:ON разрешает
        использовать !var! в качестве расширения переменной var во время
        выполнения. Синтаксис var служит для расширения переменных
        при вводе, что приводит к совсем другим результатам внутри
        цикла FOR.
/V:OFF  Запрет отложенного расширения переменных среды.


Если Вы планируете как-то компоновать разные коды — делайте это правильно. Исходные коды коллег работают корректно. Либо изначально озвучивайте полное ТЗ:
Цитата:

Цитата shadowbat
да банально скопировать файл file.txt в file-txt\file.txt чтобы лишний раз не дублировать точку в имени папки. »

P.S. А чем Вам не нравится точка в имени каталога?

alpap 24-09-2019 13:48 2889374

Цитата:

Цитата shadowbat
не понял »

ну вы же уже в который раз изменили название темы и соответственно условие задачи, тот код подразумевался под мое понимание первого заголовка.
На данном этапе код уже гораздо обширнее:
Код:

@echo off
set "d=C:\Papka"

pushd "%d%"
 for /f "delims=" %%a in ('dir /a-d/b "*.txt"') do set "ext=%%~xa"& call :# "%%a" "%%~na" "%%ext:.=%%"
popd
pause& exit

:#
 if not exist "%~2-%~3\%~2 %~3" md "%~2-%~3\%~2 %~3"
 >nul copy "%~1" "%~2-%~3\%~2 %~3"
exit /b


shadowbat 24-09-2019 13:52 2889375

Цитата:

Цитата Iska
Исходные коды коллег работают корректно. »

подтверждаю, работает, я неправильно вставил код

да банально скопировать файл file.txt в file-txt\file.txt чтобы лишний раз не дублировать точку в имени папки.
вот что получилось:
Код:

cmd /v/c "for %%i in ("%cd%\*.txt") do @( echo %%i & set "n=%%~ni" & set "x=%%~xi" & set "new=!n!!x:.=-!" & md "%%~dpi\!new!\" & copy "%%i" "%%~dpi\!new!\%%~nxi")"
pause

Цитата:

А чем Вам не нравится точка в имени каталога?
сама точка всем нравится, а дублирование имени файла с расширением как то не хочется лишний раз

megaloman 24-09-2019 13:58 2889380

Цитата:

Цитата shadowbat
банально скопировать файл file.txt в file-txt\file.txt »

или
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do (
                Set "Ext=%%~xi"
                >nul Call Xcopy /D /Y "%%i" "%%~dpi%%~ni-%%Ext:~1%%\"
        )
Exit /B

или
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do Set "Ext=%%~xi" &Call :NewName "%%i" "%%~ni" "%%Ext:~1%%"
Exit /B

:NewName
        >nul Xcopy /D /Y %1 "%~dp1%~2-%~3\"
Exit /B 0

Цитата:

Цитата Iska
А чем Вам не нравится точка в имени каталога »

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

shadowbat 24-09-2019 14:11 2889388

Цитата:

Цитата alpap
На данном этапе код уже гораздо обширнее: »

копирует в \file-txt\file-txt\file.txt
т.е. дублирует одну папку

Цитата:

Цитата alpap
ну вы же уже в который раз изменили название темы и соответственно условие задачи, тот код подразумевался под мое понимание первого заголовка. »

менял название темы один раз с разрешения на расширение, в течение первого часа немного менял код первого поста после фразы "этот код работает только с setlocal EnableDelayedExpansion", потому что он был на тот момент с ошибкой, задачу и текст до "этот код работает только с setlocal EnableDelayedExpansion" не менял
прошу прощения, если доставил неудобства этим
а по поводу копирования в новую папку, это не новое название темы и не новое ТЗ, это я уже сам внедрю себе, тут именно задача была в этих отложенных переменных и костыле EnableDelayedExpansion

Цитата:

Цитата megaloman
2 кода
»

оба кода работают

да это и не надо было по ТЗ, согласен, надо было сразу создавать тему именно с копированием в папку file-txt

megaloman 24-09-2019 14:15 2889390

хм, а так не работает: -еще как работает, если говорить об эхо
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do (
                Set "Ext=%%~xi"
                Call Echo "%%~ni-%%Ext:~1%%"
                Call Echo "%%~ni_%%Ext:~1%%"
                Call Echo "%%~ni %%Ext:~1%%"
Echo.
        )
Exit /B

Цитата:

Цитата shadowbat
у меня консольное окно на секунду появляется и сразу закрывается, папки не создаются »

Исправил неточность, должно быть ("%CD%\*.txt")

shadowbat 24-09-2019 14:26 2889393

____

megaloman 24-09-2019 14:33 2889396

Цитата:

Цитата shadowbat
в том сообщении был акцент на Ext2, чтобы полное изменённое имя загнать в отдельную переменную »

Вам надо ехать или шашечки? На фиг эта переменная, если результат достигается и без нее? А если хочется переменную, то используйте вариант с процедурой, который я Вам тоже предложил.

shadowbat 24-09-2019 14:45 2889398

Цитата:

Цитата megaloman
первый код»

тоже прекрасный код в одну строку

Цитата:

Цитата megaloman
еще как работает, если говорить об эхо »

а как гуглить такую магию?
Код:

"%%~ni-%%Ext:~1%%"
":~1" это обрезка какая-то ? как её нагуглить?

Цитата:

Цитата megaloman
Вам надо ехать или шашечки? На фиг эта переменная, если результат достигается и без нее? »

мне для справки, просто чтобы знать, что такой код нельзя загнать в переменную и можно только в таком виде использовать, так сказать "только в прямом эфире"

megaloman 24-09-2019 14:48 2889399

Ежели всё-таки надо не копировать файл, а переместить, то, сохраняя имя папки такое же, как у файла (с точкой в расширении)
Код:

@Echo Off
        For %%i in ("%CD%\*.txt") Do (
                >nul Move /Y "%%i" "%%i~~~"
                >nul 2>&1 Md "%%i" 
                >nul Move "%%i~~~" "%%i\%%~nxi"
        )
Exit /B


Iska 24-09-2019 14:53 2889401

Цитата:

Цитата megaloman
Если банально скопировать, при этом и файл и каталог в одной папке, то каталог не создастся. »

Само собой.

Iska 24-09-2019 16:39 2889417

Цитата:

Цитата shadowbat
а как гуглить такую магию? »

Честно? Никак. Не приспособлены поисковые системы для такого. Причём суть тут именно в полном выражении:
Код:

Call Echo "%%~ni-%%Ext:~1%%"
— без call смысл теряется.

Цитата:

Цитата shadowbat
":~1" это обрезка какая-то ? как её нагуглить? »

Цитата:

Цитата set /?
Код:

Подстановка переменной среды может быть расширена следующим образом:

    %PATH:str1=str2%

расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в
расширенном результате на "str2".  "str2" может быть пустой строкой для
эффективного удаления вхождений "str1" из расширенного вывода. "str1" может
начинаться со звездочки, и в этом случае это будет соответствовать любому
началу расширенного вывода до первого вхождения оставшейся части "str1".


Можно также использовать строки расширения.

    %PATH:~10,5%

расширит действие переменной среды PATH, затем использует только 5
символов, которые начинаются с 11-го символа (пропустив 10) расширенного
результата.  Если длина не указана, по умолчанию используется оставшееся
значение переменной.  Если оба значения (длина и число пропускаемых символов)
отрицательны, следующим используемым значением будет длина значения переменной
среды, добавленной к указанному значению пропуска или указанной длины.

    %PATH:~-10%

извлечет последние 10 символов переменной PATH.

    %PATH:~0,-2%

извлечет все символы переменной PATH, за исключением 2-х последних.


А так… Рекомендую загрузить Download Windows Command Reference from Official Microsoft Download Center, пройтись по живым ссылкам из этой темы: CMD/BAT: Коллекция ссылок — CMD/BAT — Коллекция скриптов и идей — Серый форум (обе части «Уроков bat-аники» — обязательно, Rob van der Woude, Timo Salmi и ss64.com — тоже обязательно), пройтись по всем …цати частям тем Командная строка, батники, сценарии (bat, cmd) - [1] :: Программы :: Компьютерный форум Ru.Board (всего 5 частей) и Задачи на bat-файлах - [1] :: Microsoft Windows :: Компьютерный форум Ru.Board (12 частей).

shadowbat 24-09-2019 17:05 2889422

Iska, благодарю за расширенный комментарий

alpap 24-09-2019 17:54 2889433

Цитата:

Цитата shadowbat
копирует в \file-txt\file-txt\file.txt
т.е. дублирует одну папку »

ничего подобного
до запуска
после запуска
плюс лог в подтверждение:
Скрытый текст

Код:

-------------------------------------
24.09.2019-17:50:05,57
copy "file111.txt" "file111-txt\file111 txt"
Скопировано файлов:        1.
-------------------------------------
-------------------------------------
24.09.2019-17:50:05,57
copy "fileAAA.txt" "fileAAA-txt\fileAAA txt"
Скопировано файлов:        1.
-------------------------------------


shadowbat 24-09-2019 18:20 2889437

Цитата:

Цитата alpap
ничего подобного »

произошло недопонимание, в том конкретном случае надо было положить файл file.txt в \file-txt\file.txt либо в \file txt\file.txt , этот код делает \file-txt\file txt\file.txt, т.е. две папки вместо любой одной

да, я неверно написал, что дублирует, технически папки с разными именами

alpap 24-09-2019 21:17 2889452

Цитата:

Цитата shadowbat
надо было положить файл file.txt в \file-txt\file.txt »

и тут условия меняются с изначальными, ну делов-то, слегка изменить подпрограмму:
Скрытый текст
Код:

...

:#
 if not exist "%~2-%~3" md "%~2-%~3"
 >>log.txt (
  echo -------------------------------------
  echo %date%-%time%
  echo copy "%~1" "%~2-%~3"
  copy "%~1" "%~2-%~3"
  echo -------------------------------------
 )
exit /b



Время: 20:29.

Время: 20:29.
© OSzone.net 2001-