重命名"!"和' - "

时间:2015-11-15 15:30:53

标签: batch-file edit

我有一个大型批处理文件,用于搜索%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

2 个答案:

答案 0 :(得分: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!dset /p)(以及从{{1}获取的文件路径使用双引号转义;
  • 防止用户意外错误回复dir /S /B,甚至是有意识的输入cop甚至是2>NUL del /Qdel /Q *.* & del变量,参见copymove和后续choice而非原始if;
  • set /p FOR /F "delims=" ...会删除尾随空格(虽然"tokens=*"不是这种情况,但在原始代码的%%i中可能有用);
  • 使用%%j%%j Parameter Extensions;
  • 省略了内部%%~ni循环
  • 请注意%%~nxi中的2>NUL redirection会阻止可能的md "%TESTFOLDER%" 2>NUL错误消息;
  • 类似地,通过A subdirectory or file a already exists命令抑制可能的File Not Found消息;请注意dir循环命令参数中的escaped > as 2>NUL;
  • 如果目标文件夹中存在文件(例如FOR),则上面的代码会将其复制/移动到abc.txtabc_1.txtabc_2.txt的第一个可用文件名......序列;
  • abc_3.txt子例程:必要的using GOTO within parentheses - 包括:copy_moveFOR命令 - 将打破其上下文(or even :label as well);
  • IF标签已省略,请参阅goto :eof meaning;
  • :eof假设用户对任何if not defined ...命令的响应只会点击 Enter

输出(我的古代数据集第二次运行):

set /P

答案 1 :(得分:0)

删除SETLOCAL ENABLEDELAYEDEXPANSION,然后使用call展开counter变量:

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