Batch file 更名&引用;和'-&引用;
我有一个大的批处理文件,用于搜索%CD%和子目录,并移动、复制或删除我选择的文件。 我遇到了一个问题,.bat文件将传递任何类型的文件,如果它们的名称中有某些符号,如(!,-)。 它们是一种让批处理文件%CD%和子目录搜索包含这些符号的文件并用当前名称重命名它们而不使用符号的方法吗? 为了便于讨论,让我们只使用(!)符号,其余部分我可以编辑。 先谢谢你 编辑--------------------------------------------------- 这是我正在使用的代码的一部分。我没有一个适合我目前正在努力实现的目标Batch file 更名&引用;和'-&引用;,batch-file,edit,Batch File,Edit,我有一个大的批处理文件,用于搜索%CD%和子目录,并移动、复制或删除我选择的文件。 我遇到了一个问题,.bat文件将传递任何类型的文件,如果它们的名称中有某些符号,如(!,-)。 它们是一种让批处理文件%CD%和子目录搜索包含这些符号的文件并用当前名称重命名它们而不使用符号的方法吗? 为了便于讨论,让我们只使用(!)符号,其余部分我可以编辑。 先谢谢你 编辑--------------------------------------------------- 这是我正在使用的代码的一部分。我没有
@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
删除
SETLOCAL ENABLEDELAYEDEXPANSION
,改为使用call
展开计数器
变量:
set /a counter+=1
call %copymove% "%%i" ".\%TESTFOLDER%\%%j_%%counter%%.%Type%"
保持安全,正确报价,并禁用延迟扩展: 说明:
- 始终使用
-扩展。用户对%
(以及从set/p
命令获得的文件路径)的响应中的所有dir/s/b
-有毒字符(例如有效文件夹名称和/或扩展名cmd
或a&b
)都使用双引号转义李>c!d
- 防止用户意外地错误响应
或甚至轻视对cop
变量的copymove
和随后的option
而不是原语if
李>set/p
作为FOR/F“delims=”…
将删除尾随空格(虽然这不是“tokens=*”
的情况,但在原始代码的%%i
中可能有用)李>%%j
- 使用
和%%ni
省略内部%%nxi
循环李>%%j
- 请注意,
md”%TESTFOLDER%”2>NUL中的
会抑制可能存在的2>NUL
错误消息李>子目录或已存在的文件
- 类似地,通过
命令抑制可能的dir
消息;文件未找到
循环命令参数李>中的注释用于
- 如果目标文件夹中存在文件(例如,
),则上述代码会将其从abc.txt
,abc_1.txt
,abc_2.txt
复制/移动到第一个可用文件名。。。序列李>abc_3.txt
子例程:必要时-包括:copy_move
和FOR
命令-将中断其上下文()李>IF
标签,请参阅李>:省略eof
:如果用户对任何如果未定义…
命令的响应仅是按Enter键,该怎么办李>set/P
- 类似地,通过
我真正需要的是搜索和重命名所有没有符号的文件的代码。我不介意它是一个单独的批处理文件,如果有必要,我可以随时调用:it。一个已知的命令“CD”可以使用一个同名的环境变量%CD%吗。我认为一些环境变量,如%DIR%%DEL%,很特别,它们设置了默认命令行选项或特定于该命令的其他详细信息。很抱歉Wql Surfer您失去了我,我已经很久没有制作.Bat文件了,但我正在理解。所以我不太清楚你在说什么。但是现在你在文件名中遇到了问题,
^
,它以“!”失败或者文件名nice中的“^”,现在似乎是bulletproof@jeb我知道有不安全的md“%TESTFOLDER%”
。如果存在同名文件,则不会创建文件夹,例如类型nul>“%TESTFOLDER%”
:)可能需要额外的测试帮助:如果不存在“%TESTFOLDER%”转到:invalidTestFolder
。
@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
==> 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"
==>