2015-11-15 3 views
1

У меня есть большой пакетный файл, который ищет% CD%, а также перемещает подкаталоги и эфир, копирует или удаляет файлы по моему выбору. У меня возникла проблема, в которой файл .bat будет передавать файлы любой тип, если у них есть определенные символы в их имени, такие как (!, -). Является ли это способом поиска пакетного файла% CD% и подкаталога для файлов, содержащих эти символы, и переименовывать их с их текущим именем без символы? Для аргументации ради просто используйте символ (!), и я могу редактировать остальные. Заранее благодарю вас.Переименование "!" и «-»

EDIT ---------------- ----------------------------------- Вот часть моего кода, который я использую. У меня нет один для того, что я пытаюсь выполнить на данный момент.

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
set /p folder1=Folder Name: 
set TESTFOLDER=%folder1% 
set /p Type=Enter File Type: 
set /p copymove=Copy or Move: 
set /p directory=DIR: 
md "%TESTFOLDER%" 

set /a counter=0 
FOR /F "tokens=*" %%i IN ('DIR /S /B /A-D "%directory%\""*.%Type%"') DO FOR  /F "tokens=*" %%j IN ('DIR /B "%%i"') DO IF EXIST ".\%TESTFOLDER%\%%j" (
    set /a counter=!counter!+1 
    echo folder: %TESTFOLDER% 
    %copymove% "%%i" ".\%TESTFOLDER%\"%%j_!counter!.%Type%"" 
) ELSE %copymove% "%%i" ".\%TESTFOLDER%\%%j" 

:eof 
+0

Все, что мне действительно нужно, это код для поиска и переименовать все файлы без символов. Я не возражаю, что это отдельный пакетный файл, я всегда могу позвонить: он, если понадобится. – FootBallBat

+0

Может ли известная команда «CD» использовать переменную окружения с тем же именем% CD%. Я думал, что некоторые переменные среды, такие как% DIR%% DEL%, были особенными, поскольку они задавали параметры командной строки по умолчанию или другие детали, специфичные для этой команды. –

+0

Мне жаль, что Wql Surfer ты меня потерял, я не делал. Бат-файл очень долго, но я ловлю. Поэтому я не совсем уверен, о чем вы говорите. – FootBallBat

ответ

0

Удалить SETLOCAL ENABLEDELAYEDEXPANSION и вместо того, чтобы использовать call расширить counter переменную:

set /a counter+=1 
call %copymove% "%%i" ".\%TESTFOLDER%\%%j_%%counter%%.%Type%" 
+0

Это сработало отлично ... Спасибо – FootBallBat

+0

Но теперь у вас возникают проблемы с '^' в именах файлов – jeb

2

Оставайтесь на безопасной стороне с надлежащей цитировании и задержкой расширения отключены:

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
set /p "folder1=Folder Name: " 
if not defined folder1 set "folder1=33721424" 
set "TESTFOLDER=%folder1%" 
md "%TESTFOLDER%" 2>NUL 

set /p "Type=Enter File Type: " 
if not defined type set "type=txt" 

rem set /p copymove=Copy or Move: 
choice /C CM /M "Copy or Move" 
if %errorlevel% EQU 2 (set "copymove=move") else (set "copymove=copy") 

set /p "directory=DIR: " 
if not defined directory set "directory=D:\bat\Unusual Names" 

FOR /F "delims=" %%i IN ('DIR /S /B /A-D "%directory%\*.%Type%"') DO (
    set "_fileToMove=%%i" 
    set "_filename=%%~ni" 
    set "_fileexte=%%~xi" 
    call :copy_move 
) 
:endscript 
ENDLOCAL 
goto :eof 

:copy_move 
set "_filennew=%_filename%" 
set /a "counter=0" 
:cmLoop 
set /a "counter+=1" 
IF EXIST ".\%TESTFOLDER%\%_filennew%%_fileexte%" (
    set "_filennew=%_filename%_%counter%" 
    goto :cmLoop 
) 
echo "%_filennew%%_fileexte%" 
%copymove% "%_fileToMove%" ".\%TESTFOLDER%\%_filennew%%_fileexte%" >NUL 
goto :eof 

Объяснение:

  • последовательно использовать % -расширение. Все cmd -образные символы (например, действительное имя папки и/или расширение a&b или c!d) в ответе пользователя на set /p (а также пути к файлу, полученные из команды dir /S /B) экранируются с использованием двойных кавычек;
  • предотвратить ошибочный ответ пользователя cop или даже встречный вход 2>NUL del /Q или даже del /Q *.* & del до copymove переменная, ср. choice и последующий if вместо примитива set /p;
  • FOR /F "delims=" ... как "tokens=*" удаляет конечные пробелы (хотя это не относится к %%i, но может быть полезным в %%j в вашем исходном коде);
  • опущен внутренний %%j цикл с использованием %%~ni и %%~nxiParameter Extensions;
  • примечание, что 2>NULredirection в md "%TESTFOLDER%" 2>NUL подавляет возможно A subdirectory or file a already exists сообщение об ошибке;
  • аналогичным образом, подавлено возможно File Not Found сообщение dir команда; примечание escaped > as 2>NUL в аргументе команды FOR;
  • если файл существует (например, abc.txt) в целевой папке, затем выше приведенный выше код будет скопировать/переместить его в первый доступный имя файла из abc_1.txt, abc_2.txt, abc_3.txt ...последовательность;
  • :copy_move подпрограмма: необходимо как using GOTO within parentheses - в том числе FOR и IF команды - нарушат их контекст (or even :label as well);
  • :eof этикетка опущена, см. goto :eof meaning;
  • if not defined ...: что, если ответ пользователя к любому из set /P команд будет только отбивание Введите?

Выход (второй работает на моем древнем наборе данных):

==> D:\bat\SO\33721424.bat 
Folder Name: 
Enter File Type: 
Copy or Move [C,M]?C 
DIR: 
"01exclam!ation_1.txt" 
"02exc!lam!ation_1.txt" 
"11per%cent_1.txt" 
"12per%cent%_1.txt" 
"13per%OS%cent_1.txt" 
"14per%%OS%%cent_1.txt" 
"15per%3cent_1.txt" 
"16per%%3cent_1.txt" 
"17per%Gcent_1.txt" 
"18per%%Gcent_1.txt" 
"21ampers&nd_1.txt" 
"21ampers^&nd_1.txt" 
"22ampers&&nd_1.txt" 
"22ampers^&^&nd_1.txt" 
"31(left_parenthesis_1.txt" 
"32(both)parentheses_1.txt" 
"32_rght)parenthesis_1.txt" 
"41a~tilde_1.txt" 
"51a^caret_1.txt" 
"AÄaá^ cč^DĎ(1!)&°~!.foo~bar_1.txt" 
"AÄzž^ yýS%OS%Š%%OS%%(%1!)&°~%%G!^%~2.foo~bar_1.txt" 
"BÄaá^ cčD%OS%Ď%%OS%%(%1!)&°~%%G!^%~2.foo~bar_1.txt" 
"elpfile_2.txt" 
"new - 01exclam!ation_1.txt" 
"scripts‹lpfile.txt" 
"Unicode the flag or check_1.txt" 
"Unicode the ⚑ or ✔ char_1.txt" 
"elpfile_3.txt" 

==> 
+0

Он не работает с '!' или '^' в имени файла – jeb

+0

@jeb спасибо! Исправлена. – JosefZ

+0

Ницца, теперь это похоже на пуленепробиваемые – jeb

Смежные вопросы