Показать полную графическую версию : [решено] убрать точку в цикле из расширения файла
shadowbat
22-09-2019, 21:59
есть код
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
greg zakharov
22-09-2019, 23:29
Силами 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
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
dir /b "*-txt" "* txt" »
не понял
имеется ввиду так?
for %%i in ("%CD%\*.txt") do (
dir /b "*-txt"
dir /b "* txt"
)
pause
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
Для продолжения нажмите любую клавишу . . .
@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 выдаёт значение с точкой а без точки не выдаёт
из разрешсширения файла
благодарю, поменял
не заводится
переменные !n! !x:.=! как раз и работают только в случае с EnableDelayedExpansion, нет? »
окно выдаёт: »
Заводится. Параметр /v интерпретатора команд как раз включает отложенное раскрытие переменных окружения на указанный сеанс его работы:
…
/V:ON Разрешение отложенного расширения переменных среды с применением
символа '!' в качестве разделителя. Например, /V:ON разрешает
использовать !var! в качестве расширения переменной var во время
выполнения. Синтаксис var служит для расширения переменных
при вводе, что приводит к совсем другим результатам внутри
цикла FOR.
/V:OFF Запрет отложенного расширения переменных среды.
…
Если Вы планируете как-то компоновать разные коды — делайте это правильно. Исходные коды коллег работают корректно. Либо изначально озвучивайте полное ТЗ:
да банально скопировать файл file.txt в file-txt\file.txt чтобы лишний раз не дублировать точку в имени папки. »
P.S. А чем Вам не нравится точка в имени каталога?
не понял »
ну вы же уже в который раз изменили название темы и соответственно условие задачи, тот код подразумевался под мое понимание первого заголовка.
На данном этапе код уже гораздо обширнее:
@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
Исходные коды коллег работают корректно. »
подтверждаю, работает, я неправильно вставил код
да банально скопировать файл 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
банально скопировать файл 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
А чем Вам не нравится точка в имени каталога » Если банально скопировать, при этом и файл и каталог в одной папке, то каталог не создастся. В этом случае надо как-то выкручиваться.
shadowbat
24-09-2019, 14:11
На данном этапе код уже гораздо обширнее: »
копирует в \file-txt\file-txt\file.txt
т.е. дублирует одну папку
ну вы же уже в который раз изменили название темы и соответственно условие задачи, тот код подразумевался под мое понимание первого заголовка. »
менял название темы один раз с разрешения на расширение, в течение первого часа немного менял код первого поста после фразы "этот код работает только с setlocal EnableDelayedExpansion", потому что он был на тот момент с ошибкой, задачу и текст до "этот код работает только с setlocal EnableDelayedExpansion" не менял
прошу прощения, если доставил неудобства этим
а по поводу копирования в новую папку, это не новое название темы и не новое ТЗ, это я уже сам внедрю себе, тут именно задача была в этих отложенных переменных и костыле EnableDelayedExpansion
2 кода
»
оба кода работают
да это и не надо было по ТЗ, согласен, надо было сразу создавать тему именно с копированием в папку file-txt
https://c.radikal.ru/c04/1909/a7/e6125935098b.jpg
megaloman
24-09-2019, 14:15
@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
у меня консольное окно на секунду появляется и сразу закрывается, папки не создаются » Исправил неточность, должно быть ("%CD%\*.txt")
shadowbat
24-09-2019, 14:26
____
megaloman
24-09-2019, 14:33
в том сообщении был акцент на Ext2, чтобы полное изменённое имя загнать в отдельную переменную »Вам надо ехать или шашечки? На фиг эта переменная, если результат достигается и без нее? А если хочется переменную, то используйте вариант с процедурой, который я Вам тоже предложил.
shadowbat
24-09-2019, 14:45
первый код»
тоже прекрасный код в одну строку
еще как работает, если говорить об эхо »
а как гуглить такую магию?
"%%~ni-%%Ext:~1%%"
":~1" это обрезка какая-то ? как её нагуглить?
Вам надо ехать или шашечки? На фиг эта переменная, если результат достигается и без нее? »
мне для справки, просто чтобы знать, что такой код нельзя загнать в переменную и можно только в таком виде использовать, так сказать "только в прямом эфире"
megaloman
24-09-2019, 14:48
Ежели всё-таки надо не копировать файл, а переместить, то, сохраняя имя папки такое же, как у файла (с точкой в расширении)@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
Если банально скопировать, при этом и файл и каталог в одной папке, то каталог не создастся. »
Само собой.
а как гуглить такую магию? »
Честно? Никак. Не приспособлены поисковые системы для такого. Причём суть тут именно в полном выражении:
Call Echo "%%~ni-%%Ext:~1%%"
— без call смысл теряется.
":~1" это обрезка какая-то ? как её нагуглить? »
Подстановка переменной среды может быть расширена следующим образом:
%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 (https://www.microsoft.com/en-us/download/details.aspx?id=2632), пройтись по живым ссылкам из этой темы: CMD/BAT: Коллекция ссылок — CMD/BAT — Коллекция скриптов и идей — Серый форум (http://forum.script-coding.com/viewtopic.php?id=2887) (обе части «Уроков bat-аники» — обязательно, Rob van der Woude, Timo Salmi и ss64.com — тоже обязательно), пройтись по всем …цати частям тем Командная строка, батники, сценарии (bat, cmd) - [1] :: Программы :: Компьютерный форум Ru.Board (http://forum.ru-board.com/topic.cgi?forum=5&topic=4582) (всего 5 частей) и Задачи на bat-файлах - [1] :: Microsoft Windows :: Компьютерный форум Ru.Board (http://forum.ru-board.com/topic.cgi?forum=62&topic=6156) (12 частей).
shadowbat
24-09-2019, 17:05
Iska, благодарю за расширенный комментарий
копирует в \file-txt\file-txt\file.txt
т.е. дублирует одну папку »
ничего подобного
до запуска (https://drive.google.com/open?id=1QlYL5g7ydYjS69JBQHdLVrL5vCNMK8p5)
после запуска (https://drive.google.com/open?id=19lEZVC6f-GghlMYxxTbwIwYVrBzU0TwI)
плюс лог в подтверждение:
-------------------------------------
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
ничего подобного »
произошло недопонимание, в том конкретном случае надо было положить файл file.txt в \file-txt\file.txt либо в \file txt\file.txt , этот код делает \file-txt\file txt\file.txt, т.е. две папки вместо любой одной
https://b.radikal.ru/b22/1909/a6/96679ff51e29t.jpg (https://b.radikal.ru/b22/1909/a6/96679ff51e29.png)
да, я неверно написал, что дублирует, технически папки с разными именами
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.