#windows #batch-file #cmd
Вопрос:
Я ищу архив 10.0000 файлов в аналогичном формате:
Файлы:
- 871-517-06461-1-120-01.pdf
- 871-517-06461-1-113-01.stp
- 871-517-06461-1-100-01.pdf
Пример сгенерированного каталога: 871-517-06461-1
- нав.
- TPD
- INS
Файлы:
- 871-517-21541-1-100-01.pdf
- 871-517-21541-1-110-01.pdf
- 871-517-21541-1-113-01.stp
Пример сгенерированного каталога: 871-517-21541-1
- нав.
- TPD
- INS
Как бы это можно было заархивировать? Я придумал это:
@echo off
setlocal enabledelayedexpansion
for %%A in (*.pdf *.stp) do (
set data=%%A
echo file found !data:~0,16!
for /f "delims=" %%B in ("%%A") do set fname=%%~nB
for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
for /f "tokens=1* delims=_" %%D in ("!fname!") do set folname=%%D
echo folder name !folname:~0,16!
if not exist "!folname:~0,16!" (
echo Folder !folname:~0,16! does not exist, creating
md "!folname:~0,16!"
md "!folname:~0,16!TPD"
md "!folname:~0,16!NAV"
md "!folname:~0,16!INS"
) else (
echo Folder!folname:~0,16! already exists >> log.txt
)
echo Moving file %%A to folder !folname:~0,16!
move "%%A" "!folname:~0,16!TPD"
)
echo Finished
pause
Это работает, но как я могу это упростить?
Также могу ли я как-то изменить количество символов, установив переменную?
Можно ли удалить последний знак? Таким образом, 871-517-06461-1 называется 871-517-064611.
Комментарии:
1. cmd имеет довольно ограниченные возможности, поэтому это гораздо сложнее сделать по сравнению с powershell
2. @phuclv спасибо, но мое понимание powershell также довольно низкое.
3. Чего вы хотите достичь? Существует ли каталог
871-517-21541-1
уже или он должен быть создан? откуда берутся каталогиNAV
,TPD
,INS
? Затем вы утверждаете, что ваш код не работает и работает одновременно; что правда? что, если это не сработает? Пожалуйста, будьте конкретны!4. Извини, раньше это не работало, но я заставил это работать… Я хочу: это работает, но как я могу это упростить? Также могу ли я как-то изменить количество символов, установив переменную? Можно ли удалить последний знак? Таким образом, 871-517-06461-1 называется 871-517-064611.
5. Нет, не повторяйте то же самое снова, объясните, чего вы действительно хотите достичь, чтобы кто-то, кто не сидит перед вашим компьютером, тоже мог понять…
Ответ №1:
Вам это помогает?
Он не считает символы (ваши должны были быть 15
в любом случае), он изолирует все, вплоть до четвертого дефиса/тире, -
.
@Echo Off
SetLocal EnableExtensions
For /F "Delims=" %%G In (
'(Set PATHEXT^=^) ^amp; %SystemRoot%System32where.exe "%~dp0.":"?*-?*-?*-?*-*.pdf" "%~dp0.":"?*-?*-?*-?*-*.stp" 2^>NUL'
) Do For /F "Tokens=1-4,* Delims=-" %%H In ("%%~nG") Do (
For %%L In (INS NAV TPD) Do If Not Exist "%%~dpG%%H-%%I-%%J-%%K%%L" MD "%%~dpG%%H-%%I-%%J-%%K%%L"
If Exist "%%~dpG%%H-%%I-%%J-%%KTPD" Move /Y "%%G" "%%~dpG%%H-%%I-%%J-%%KTPD" 1>NUL
)
Я не включил все бессмысленные echo
сообщения, поэтому вам нужно будет адаптировать их для тех, кто вам действительно нужен. Однако, пожалуйста, не вносите такие изменения до того, как вы его протестируете. Единственное, что вам может потребоваться изменить,-это исходный путь; в приведенных выше случаях %~dp0.
для того же расположения, что и запущенный пакетный файл, вы можете изменить его только .
для текущего каталога или фактического относительного или абсолютного пути, если хотите (стараясь не удалять заключающие их двойные кавычки).
Комментарии:
1. Это работает великолепно! Я учусь здесь всему.