Войти

Показать полную графическую версию : [решено] Нужны 3 куска кода, которые можно было применять в разным местах в 1-ом BAT-файле.


KOD65001
01-07-2020, 17:23
Нужны 3 куска кода, которые можно было применять в разным местах в 1-ом BAT-файле.

Есть код BAT:

set /p param=<"4455.txt" - ЧИТАЕТ ПЕРВУЮ СТРОКУ В TXT-файле

echo %param% | msg * - ВЫВОД ЗНАЧЕНИЯ ПЕРЕМЕННОЙ "param"

Задача:

1) Вместо СТРОКИ нужно СОХРАНИТЬ В ПЕРЕМЕННУЮ "param" ИМЯ TXT-файла
(чтобы во время выполнения bat выводилось "4455" - это имя только для примера)
P.S. ВАЖНО чтобы в переменной сохранялись и выводились не только цифры,
но и русские, английские буквы, символы Sv!F^@&$...например имя "СпаСиБо!SvF^@&$"
так как имя файла может быть всегда разным!

2) Переименовать этот TXT-файл в "12345.txt"

3) Вернуть обратно имя TXT-файла (переименовать с 12345.txt на "4455.txt")
используя переменную "param"

Нужно сделать эти действия в BAT-файле!
Понимаю, что есть другие способы сделать те же действия, но хотел бы использовать только код BAT,
поэтому PowerShell или дополнительные утилиты, программы для BAT-файла нежелательны

megaloman
01-07-2020, 18:18
KOD65001, Не понятно:@Echo Off
cls
Set "param=СпаСиБо!SvF^@&$.txt"
dir "%param%"
pause
msg * "%param%"
Ren "%param%" "12345.txt"
dir "12345.txt"
pause
Ren "12345.txt" "%param%"
dir "%param%"
pause
Exit /B

KOD65001
01-07-2020, 21:44
Спасибо megaloman! :) Прошу прощения за то что сразу не написал, необходимо чтобы имя бралось не только у текстового файла, а у любого типа файла и с разным расширением. Имя файла берется из пути C:\1\111\*.* В код который написали я добавил еще и кодировку и все стало нормально отображаться. Только как сделать чтобы в переменную "param" бралось имя любого типа файла лежащего в пути C:\1\111\*.* ?


@Echo Off
cls
chcp 1251
Set "param=СпаСиБо!SvF^@&$.txt"
chcp 866 >NUL
chcp 1251
dir "%param%"
chcp 866 >NUL
pause
chcp 1251 >NUL
msg * "%param%"
chcp 866 >NUL

pause
chcp 1251 >NUL
Ren "%param%" "12345.txt"
chcp 866 >NUL
chcp 1251 >NUL
dir "12345.txt"
chcp 866 >NUL
pause

chcp 1251 >NUL
Ren "12345.txt" "%param%"
chcp 866 >NUL

chcp 1251 >NUL
dir "%param%"
chcp 866 >NUL
pause
Exit /B

"12345.txt" - именно в это имя, или его тоже надо откуда-то взять? »
в вашем коде который выше, все работает как надо! :) просто переименовываем его в "12345", мы нигде не берем. В вашем коде все правильно)

KOD65001
01-07-2020, 22:29
простите меня :) плохо объяснять умею...

Основные действия:

1. Автоматическое определение имени и расширения файла лежащего в C:\1\111\*.* и присваивание имени файла в переменную "param" (без необходимости изменять в ручную имя и расширение)

2. Просто переименовываем файл лежащий в C:\1\111\*.* в имя "12345" без изменения расширения у файла. "12345" - нигде не берется, просто переименовываем

3. Вернуть обратно имя файлу, которое было в самом начале

megaloman
01-07-2020, 23:30
KOD65001, Не понимаю, зачем нужна именно переменная %param%. Чтобы автоматически определить имена+расширение файлов в папке придётся использовать For с последующими трудностями работы с этой переменной.@Echo Off
cls
Set "BoxIn=Z:\Soft_In"
Set "Mask=*.*"
Set "NewName=12345"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D`) DO (
Set "param=%%f"
Call msg * "%%param%%"
Echo 1 ----------------
Call Dir "%BoxIn%\%%param%%"
Pause
Call Ren "%BoxIn%\%%param%%" "%NewName%%%~xf"
Echo 2 ----------------
Dir "%BoxIn%\%NewName%%%~xf"
Pause
Call Ren "%BoxIn%\%NewName%%%~xf" "%%param%%""
Echo 3 ----------------
Call Dir "%BoxIn%\%%param%%"
Pause
)
Exit /B
@Echo Off
cls
Set "BoxIn=Z:\Soft_In"
Set "Mask=*.*"
Set "NewName=12345"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D`) DO (
msg * "%%f"
Echo 1 ----------------
Dir "%BoxIn%\%%f"
Pause
Ren "%BoxIn%\%%f" "%NewName%%%~xf"
Echo 2 ----------------
Dir "%BoxIn%\%NewName%%%~xf"
Pause
Ren "%BoxIn%\%NewName%%%~xf" "%%f"
Echo 3 ----------------
Dir "%BoxIn%\%%f"
Pause
)
Exit /B
И, кстати, зачем постоянно дергать chcp, сохраните батник в 866 кодировке и больше его не дергайте.

KOD65001
03-07-2020, 00:08
megaloman огромное спасибо! переменная %param% была нужна для того, чтобы передать ее значения в vbs скрипт. Как и сказали переменную цикла действительно лучше использовать. Наверно это уже не по теме, но хотел спросить. А как в VBS файле прописать путь до текстового файла "ca.txt" который будет лежать в папке "Temp" независимо где находится сама папка "Temp" у пользователя т.е. чтобы эта папка определялась автоматически как у bat..типа такого: %TEMP%\ca.txt Тоже самое надо как то прописать %TEMP% и в vbs но не знаю как. На данный момент в VBS скрипте стоит "КОНКРЕТНЫЙ ПУТЬ"...

Вот это:

objStream.LoadFromFile("C:\Users\User\AppData\Local\Temp\ca.txt")

У пользователя эта папка может быть в любом другом месте, например "C:\Temp\". В BAT для этого нужно поставить %TEMP%\ , а в VBS как?

Iska
03-07-2020, 01:07
KOD65001, вообще-то, здесь, как и на многих других форумах, принято правило «Одна проблема — одна тема», а не «Один пользователь — одна тема».

megaloman
03-07-2020, 16:00
Set WSE = CreateObject("WScript.Shell").Environment
FName = WSE("Temp")

FName = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%Temp%")
MsgBox FName

alpap
03-07-2020, 18:09
В BAT для этого нужно поставить %TEMP% »
как и %TMP% в bat это: "C:\Users\User\AppData\Local\Temp"
там нет простой возможности поменять ее расположение
если
У пользователя эта папка может быть в любом другом месте, например "C:\Temp\" »
то именно абсолютный путь, тем более папок "Temp" не одна по компьютеру не считая и созданные в любом месте.
например у меня их:
161885

megaloman
03-07-2020, 19:49
Iska, KOD65001, Исправил предыдущий пост, спасибо Iska

KOD65001
04-07-2020, 01:49
Спасибо alpap! за информацию - "тем более папок "Temp" не одна по компьютеру не считая и созданные в любом месте", обязательно это учту :)




© OSzone.net 2001-2012