我有一个大型批处理文件,用于搜索%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 :(得分: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
)(以及从{{1}获取的文件路径使用双引号转义; dir /S /B
,甚至是有意识的输入cop
甚至是2>NUL del /Q
到del /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.txt
,abc_1.txt
,abc_2.txt
的第一个可用文件名......序列; abc_3.txt
子例程:必要的using GOTO
within parentheses - 包括:copy_move
和FOR
命令 - 将打破其上下文(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%"