Как я могу переименовать все файлы в папке с пробелами внутри переменной - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь создать командный файл, который переименовывает файлы в папке. Каждый из них имеет одинаковый формат именования: car error file (1).txt.

Как я могу удалить пробелы из заголовка? Я должен заменить все пробелы, символы табуляции и аналогичные символы в каждом файле и заменить их веселыми символами (|), чтобы я мог взять строку из каждого из файлов.

У меня ошибка в том, что командный файл пытается найти файл только с именем car и, очевидно, его не существует.

Имя old не нужно сохранять после, поэтому все они могут называться car1, car2 и т. Д.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET dir=C:\Users\betacom\Desktop\file\pat\SEMPREALAMENTARSEOH\

echo.>Output.csv

for /f %%f in ('dir /b %dir%*.txt') do (
    ::rename %%f "something.txt"
)

for /f %%f in ('dir /b %dir%*.txt') do (
    for /f "delims=" %%a in ('findstr \.edi %dir%%%f') do echo(%%a;;%%f)>>Output.csv

::after this row above will be:
    REM for /f "tokens=2 delims=|" %%a in ('findstr \.edi %dir%%%f') do echo(%%a;;%%f)>>%dir%Output.csv

)

текущие имена файлов:

файл ошибок автомобиля (1) .txt
файл ошибки автомобиля (2) .txt ...

что мне нужно, чтобы они были:

car1.txt
car2.txt ...

Ответы [ 2 ]

0 голосов
/ 11 июля 2019
@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
:again
SET /a processed=0
FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\*car*" ' ) DO (
 rem for each filename matching mask...
 FOR /f "tokens=1*delims=() " %%p IN ("%%a") DO IF "%%q" neq "" (
  rem here for filenames containing at least 1 of the delimiter set to be eliminated
  rem try to create a new filename containing not-banned characters
  SET /a processed+=1
  SET "changedthisname="
  FOR %%r IN ("" _ $ x q j %random%) DO IF NOT DEFINED changedthisname (
   IF NOT EXIST "%sourcedir%\%%p%%~r%%q" REN "%sourcedir%\%%a" "%%p%%~r%%q"&SET "changedthisname=y"
  )
 )
)
ECHO namechange attempts=%processed%%
IF %processed% gtr 0 GOTO again
GOTO :EOF

Вам необходимо изменить настройку sourcedir в соответствии с вашими обстоятельствами. В листинге используется настройка, которая подходит для моей системы.

Поскольку вы, похоже, не заботитесь о новом имени файла, при условии, что оно не содержит символов, которые вы хотите удалить, возможно, это поможет вам.

Внешний цикл ищет любое имя файла, содержащее car, и присваивает имя полностью %%a.

Следующий цикл анализирует имя и разбивает его на две части - до и после любого из нежелательных символов (устанавливается в delims=). Если в имени файла нет ни одного из нежелательных символов, то вторая часть имени файла в %%q будет пустой, поэтому мы можем их игнорировать. В противном случае мы пытаемся заменить другие разрешенные символы на запрещенные. Я выбрал "" (пустая строка - просто отбросить символы), _, $, x, q, j (как они редки) или случайное число. changedthisname отслеживает, был ли файл переименован, чтобы процесс не пытался выполнить несколько переименований одного и того же файла.

processed подсчитывает имена файлов, которые содержали нежелательные символы на любом проходе, поэтому в конце прохода, если ничего не найдено, мы заканчиваем.

Таким образом, имя файла, например car error file (1).txt, использующее ()[space] в качестве разделителей для %%p, может обработать имя до car$error file (1).txt на первом проходе, car$error_file (1).txt, car$error_filej1).txt на третьем и car$error_filej19162.txt на четвертом .

Хорошо, хорошо - раздел "изменение имени на" немного сложен и его можно убедить сделать car + случайным числом - но, эй, компьютеры сложны, и простым случайным числом будет - ну, совсем не весело.

0 голосов
/ 11 июля 2019

По запросу:

@echo off

set "dir=C:\Users\betacom\Desktop\file\pat\SEMPREALAMENTARSEOH"

setlocal enabledelayedexpansion
for /f %%A in ('dir /b %dir%\*.txt') do (
    rename "%%A" "%%~nA something.txt"
    set "var=%%~nxA"
    for /f "delims=" %%B in ('findstr \.edi %dir%\!var!') do (
        echo(%%B;;%%A)>>Output.csv
        echo(%%B;;%%A)>>%dir%\Output.csv
    )
)

Не зная точно, что вы пытаетесь достичь, я реструктурировал цикл for, чтобы сделать его более понятным. Например, нет необходимости иметь отдельные циклы с одинаковыми параметрами for, когда все, что вы изменяете, это команды do - поэтому я вложил циклы и добавил несколько строк do, когда это применимо.

Я изменил некоторые вещи на основе личных предпочтений, чтобы показать, как легче следовать вашей логике, если вы начинаете с %%A и последовательно проходите алфавит при вводе новых параметров (%%A, %%B, %%C, и т. д.) - таким образом, вы знаете, что %%B - это ваш второй / вложенный параметр, без необходимости возвращаться и что-либо смотреть; также хорошо избегать строчных букв в ваших параметрах, так как некоторые из них соответствуют расширениям параметров.

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

Ссылка: Для , Параметры / Аргументы , Цитаты, Экранирующие символы, Разделители .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...