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

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

KOD65001 01-07-2020 17:23 2926989

Нужны 3 куска кода, которые можно было применять в разным местах в 1-ом BAT-файле.
 
Нужны 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 2926992

KOD65001, Не понятно:
1. СОХРАНИТЬ В ПЕРЕМЕННУЮ "param" ИМЯ TXT-файла - откуда его брать? так как имя файла может быть всегда разным!
2. Переименовать этот TXT-файл в "12345.txt" - именно в это имя, или его тоже надо откуда-то взять?
Код:

@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 2926999

Спасибо 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

Цитата:

Цитата megaloman
"12345.txt" - именно в это имя, или его тоже надо откуда-то взять? »

в вашем коде который выше, все работает как надо! :) просто переименовываем его в "12345", мы нигде не берем. В вашем коде все правильно)

KOD65001 01-07-2020 22:29 2927004

простите меня :) плохо объяснять умею...

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

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

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

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

megaloman 01-07-2020 23:30 2927011

KOD65001, Не понимаю, зачем нужна именно переменная %param%. Чтобы автоматически определить имена+расширение файлов в папке придётся использовать For с последующими трудностями работы с этой переменной.
Пример с %param%
Код:

@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 2927084

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 2927086

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

megaloman 03-07-2020 16:00 2927114

Код:

Set WSE = CreateObject("WScript.Shell").Environment
FName = WSE("Temp")

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


alpap 03-07-2020 18:09 2927124

Вложений: 1
Цитата:

Цитата KOD65001
В BAT для этого нужно поставить %TEMP% »

как и %TMP% в bat это: "C:\Users\User\AppData\Local\Temp"
там нет простой возможности поменять ее расположение
если
Цитата:

Цитата KOD65001
У пользователя эта папка может быть в любом другом месте, например "C:\Temp\" »

то именно абсолютный путь, тем более папок "Temp" не одна по компьютеру не считая и созданные в любом месте.
например у меня их:
Файл 161885

megaloman 03-07-2020 19:49 2927133

Iska, KOD65001, Исправил предыдущий пост, спасибо Iska

KOD65001 04-07-2020 01:49 2927157

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


Время: 13:52.

Время: 13:52.
© OSzone.net 2001-