Войти

Показать полную графическую версию : [решено] Переименование и копирование файлов


Страниц : 1 [2] 3 4 5

YuS_2
18-08-2018, 14:11
И как я понимаю, поскольку PowerShell исполняет файлы только с определёнными расширениями (так?), фокус провернуть не удастся. »
Да ладно... можно ведь и так:
<# ::
@echo off
powershell -ex bypass -c "&{[scriptblock]::create((gc '%~f0' -enc OEM) -join [char]10).invoke()}"
pause&exit /b
#>
$a='Привет мир!'
$b='И вам не кашлять!'
$a
$b

И кстати, в powershell v 6.0 можно и так:
<# ::
@echo off
pwsh -f "%~f0" %*
pause&exit /b
#>
$a='Привет мир!'
$b='И вам не кашлять!'
$a
$b

Iska
18-08-2018, 14:22
Да ладно... можно ведь и так: »
Поясните, что с этим кодом делать?

YuS_2
18-08-2018, 14:27
Поясните, что с этим кодом делать? »
сохранить в файле, например, с именем run.bat и запустить
кодировка скрипта в первом варианте OEM и UTF8 без BOM во втором случае

PS Ах, да, надо в первом скрипте заменить pwsh на powershell... ну, чтобы встроенный отработал, а не v6.0
поправил скрипты

Iska
18-08-2018, 15:15
сохранить в файле, например, с именем run.bat и запустить
кодировка скрипта в первом варианте OEM »
Спасибо, ясно. Работает.

Avast тут же отреагировал :). Удалил пакетный файл и попытался удалить powershell.exe.

megaloman
18-08-2018, 16:14
Если без эмоций буквально прочесть поставленную задачу и не напрягать воображение, то:
1. У файлов есть общий префикс, в постановке он check
2. После префикса идёт номер, в постановке он <999
3. Надо получить новое имя:
префикс+номер, дополненный при необходимости нулями до трёх знаков+_+имя папки
То вот еще вариант (скрипт3), тупо и прямолинейно, зато надёжно@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Folds="1111" "2222""
Set "Pref=check"
Set /A Max=1000

Set "BoxOut=Z:\Box_In\Total"
If Not Exist "%BoxOut%" Md "%BoxOut%"

Set /A Max1=%Max%-1
FOR /L %%n IN (0,1,%Max1%) DO FOR %%d IN (%Folds%) DO (
FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n.*") Do (
Set /A MMax=%Max%+%%n
Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
)
)
Pause
GoTo :Eof

YuS_2
18-08-2018, 16:26
Удалил пакетный файл и попытался удалить powershell.exe. »
И правда что, чего это он там делает? Да и каталог windows, тоже подозрительный набор файлов содержит, надо и его проредить... :)

Iska
18-08-2018, 16:50
Если без эмоций буквально прочесть поставленную задачу и не напрягать воображение, то: …»
Скорее всего, как-нибудь так и есть.

YuS_2, видимо такой гибридный способ пошёл в массы. Вероятно — в массы недописателей-вирусомайнеров.

YuS_2
18-08-2018, 17:04
видимо такой гибридный способ пошёл в массы. Вероятно — в массы недописателей-вирусомайнеров. »
Возможно. Вот только, каким бы массовым ни был этот способ, в нем нет ничего вирусного, если не считать таковым вообще запуск скриптов в ОС. К тому же, антивирус должен вирусную активность контролировать (это мое личное мнение), а не быть комбайном, стерегущим каждый вздох, заодно и запуск скриптов, да плюс авторские права и т.д., и т.п., и тут же выписывающим "расстрел на месте". :)

Iska
18-08-2018, 18:09
Кхе-кхе :)… В оное время все, поголовно все значимые антивирусы ругались на банальный CreateObject("ADODB.Stream") … .SaveToFile bla-bla-bla, не особо затрудняя себя проверкой того, что и куда пишется при этом: сказано, что ADODB.Stream .SaveToFile позволяет создавать и записывать двоичные файлы — стало быть, ату его, ату! Причём, обходилось это банальнейшим образом, каким-нибудь CreateObject("ADO" & "DB.Str" & "eam") :lol:.

jordan_74
20-08-2018, 07:30
megaloman,

Спасибо огромное! Но у меня вопрос возник, можешь вот эти 2 строки прокомментировать?

Set "BoxIn=Z:\Box_In"
Set "Folds="1111" "2222"" »

Может я что-то не правильно понимаю, Set "BoxIn=Z:\Box_In - это путь к исходной папке с файлами! ? но у меня две папки с исходными файлами, допустим 1 и 2. И в каждой лежат файлы с префиксом "check"

megaloman
20-08-2018, 09:16
jordan_74, я предполагал, что папка 1 и 2 (уу меня это 1111 и 2222 - имена могут быть произвольными) находятся в корне какой-то общей папки. У меня это Z:\Box_In (у Вас может быть иное, например D: или \\ server\shr и т д) То есть, полные пути у меня Z:\Box_In\1111 и Z:\Box_In\2222.
Меня мучали сомнения в этом. Не проблема переписать скрипт, если папка 1 и 2 - это только имена конечных папок разных путей. Но из постановки это совершенно не следует.

jordan_74
20-08-2018, 09:41
megaloman,

Да, все верно. Есть корневая папка "Rename", в которой и лежат папки "1", "2", и папка куда должны складываться переименованные файлы "total"
тоесть пути выглядят так C:\Onkassa\Rename\1\ , C:\Onkassa\Rename\2\ и C:\Onkassa\Rename\total

jordan_74
20-08-2018, 14:55
megaloman,
Работает! Но обратил внимание, когда допустим в папке "1" имена исходных файлов повторяются, система создаёт копию файла допустим "check6 — копия"
Так вот такой файл батник уже не обрабатывает, хотя по идее должно быть "check007_1". Это можно как то поправить?

megaloman
20-08-2018, 15:23
jordan_74, А что Вам нужно, определитесь!когда допустим в папке "1" имена исходных файлов повторяются, система создаёт копию файла допустим "check6 — копия"
Так вот такой файл батник уже не обрабатывает, хотя по идее должно быть "check007 »Это кривая идея.
У Вас (по идее :) ) есть файлы check6, check6 — копия, check7
И совершенно неправильно по первоначальной постановке сделать из check6 — копия check007
Что тогда придётся делать с исходной check7 ??
Задача решалась в условиях образования имени
ПрефиксНомерРасширение
Ставьте задачу, буду думать
Потом окажется, что есть файлы check6 — копия — копия - и что тогда?
Вам надо сохранять исходную нумерацию или можно перенумеровать все файлы по возрастанию времени создания ?
А как пишется копия (после номера, какие знаки: пробел минус пробел копия?)

YuS_2
20-08-2018, 15:36
Потом окажется, что есть файлы check6 — копия — копия - и что тогда? »
собственно, о чем и была речь в личке... :)

Это можно как то поправить? »
Можно сделать многое (не всё, конечно, но многое), но для этого необходимо наиболее полное описание условий... и не в процессе создания кода, а изначально. Если есть желание получить полностью рабочее решение, постарайтесь учесть все возможные варианты в условии задачи.

megaloman
20-08-2018, 15:53
jordan_74, @Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Folds="1111" "2222""
Set "Pref=check"
Set "Suff= - копия"
Set /A Max=1000

Set "BoxOut=Z:\Box_In\Total"
If Not Exist "%BoxOut%" Md "%BoxOut%"

Set /A Max1=%Max%-1
FOR /L %%n IN (0,1,%Max1%) DO FOR %%d IN (%Folds%) DO (
FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n.*") Do (
Set /A MMax=%Max%+%%n
Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
)
FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n%Suff%.*") Do (
Set /A MMax=%Max%+%%n
Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%Suff%%%~xf" >nul
)
)
Pause
GoTo :Eof
Суффикс может быть любым, только указывайте в нём все знаки, в том числе и пробелы в начале и конце суффикса. Если в префиксе или суффиксе есть кириллические символы, извольте сохранить скрипт в 866 кодировке.

Iska
20-08-2018, 15:53
Потом окажется, что есть файлы check6 — копия — копия - и что тогда? »
собственно, о чем и была речь в личке... »
[Iska гладит себя по голове]: умный чукча, умный! :lol::
Нет, я тут пас — мало желания на пакетных файлах пытаться выцепить значимую часть имени из произвольно взятых: »

megaloman
20-08-2018, 16:01
Iska, Вы не политкорректны. Надо говорить: умный представитель северного народа, умный!
Иной раз у оленеводов очень трудно добиться полной откровенности - они бывают по детски наивны и непосредственны :) Но если хочется получить удовольствие, надо проявить терпимость. Кто хочет сделать - ищет способ, кто не хочет - причину.
Каждое решение плодит новые проблемы. »

Iska
20-08-2018, 17:12
Iska, Вы не политкорректны. Надо говорить: умный представитель северного народа, умный! »
Мне можно, я ж это про себя ;).

megaloman, вот насчёт:
Каждое решение плодит новые проблемы. »
Вы совершенно правы.

Я просто искренне радуюсь, что зараз не ввязался в эту вакханалию ТЗ.

Что же до решения — то я бы, как и множество других вещей с трудно формализуемыми или часто меняющимися ТЗ, делал бы в полуавтоматическом режиме в том же Far Manager'е с плагином Visual renaming:
https://i.imgur.com/SDKlvwy.png
https://i.imgur.com/Fvnpv7n.png
в виде:
check[C001+1]_2
где:

check — постоянная часть имени (вводим ручками или подставляем по Shift-Enter из имени файла и убираем лишнее);
[C001+1] — шаблон маски (C — счётчик, 001 — в счётчике будет три символа, начиная с единицы, +1 — приращение счётчика);
_2 — постоянная часть имени в виде имени папки, тупо вводим ручками (ну, или можно предварительно просто скопировать имя каталога в буфер обмена и теперь вставить, либо же можно вставить полный путь по Ctrl-[/Ctrl-] и убрать лишнее — кому что нравится).
https://i.imgur.com/8bfAjad.png

https://i.imgur.com/8pn6uG6.png

https://i.imgur.com/DiJ7gqp.png
https://i.imgur.com/9YTXXeg.png

https://i.imgur.com/wCPyyln.png
https://i.imgur.com/f75u7wB.png

При желании можно даже задать ей приоритет, чтобы она всегда была закреплена наверху в истории
Всех делов — примерно на полминуты с нуля, и секунд десять — при ранее сохранённой маске.

YuS_2
20-08-2018, 18:02
[Iska гладит себя по голове]: умный чукча, умный! »
Да-да, это мы тоже отметили:
Угу, именно об этом Iska, сразу и написал, с чем я тоже согласен... это всё, опять таки, неполные условия.
:)

Суффикс может быть любым »
Думаю, надо погодить с решениями, ибо вполне может оказаться, что будут одновременно присутствовать несколько различных префиксов, да и суффиксы возможны в различных вариантах...
Лучше дождаться развернутых условий...




© OSzone.net 2001-2012