Batch file 更名&引用;和'-&引用;

Batch file 更名&引用;和'-&引用;,batch-file,edit,Batch File,Edit,我有一个大的批处理文件,用于搜索%CD%和子目录,并移动、复制或删除我选择的文件。 我遇到了一个问题,.bat文件将传递任何类型的文件,如果它们的名称中有某些符号,如(!,-)。 它们是一种让批处理文件%CD%和子目录搜索包含这些符号的文件并用当前名称重命名它们而不使用符号的方法吗? 为了便于讨论,让我们只使用(!)符号,其余部分我可以编辑。 先谢谢你 编辑--------------------------------------------------- 这是我正在使用的代码的一部分。我没有

我有一个大的批处理文件,用于搜索%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
    标签,请参阅
  • 如果未定义…
    如果用户对任何
    set/P
    命令的响应仅是按Enter键,该怎么办
输出(在我的古代数据集上第二次运行):


我真正需要的是搜索和重命名所有没有符号的文件的代码。我不介意它是一个单独的批处理文件,如果有必要,我可以随时调用: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"

==>