Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在CMD中使用enabledelayedexpansion时,如何获取具有特殊字符的子字符串?_String_Batch File_Cmd_Command_Prompt - Fatal编程技术网

String 在CMD中使用enabledelayedexpansion时,如何获取具有特殊字符的子字符串?

String 在CMD中使用enabledelayedexpansion时,如何获取具有特殊字符的子字符串?,string,batch-file,cmd,command,prompt,String,Batch File,Cmd,Command,Prompt,我想使用cmd重命名一个或多个文件。但是很多这样的文件都有一个特殊的特征。 例如: 通常,我们可以使用此值“^”将特殊字符串设置为简单文本。但是当设置enabledelayedexpansion时,字符串不可设置 set /p mystring=! 用户定义字符串值:!,&=和其他人 文件名由其他变量“FOR”定义,用于在文件夹中搜索 所以字符串“File”的值是“DCIM_33;01.jpeg” 更改文件名的命令: setlocal enabledelayedexpansion set ne

我想使用cmd重命名一个或多个文件。但是很多这样的文件都有一个特殊的特征。 例如:

通常,我们可以使用此值“^”将特殊字符串设置为简单文本。但是当设置enabledelayedexpansion时,字符串不可设置

set /p mystring=!
用户定义字符串值:!,&=和其他人

文件名由其他变量“FOR”定义,用于在文件夹中搜索

所以字符串“File”的值是“DCIM_33;01.jpeg”

更改文件名的命令:

setlocal enabledelayedexpansion
set new_filename=!file:^%mystring%=0!
echo !new_filename!
提示的结果是:

:=0
file:=0
DCIM_!01.jpeg
DCIM_01.jpeg
我想将“!”重写为“0”:


当我不使用特殊字符串时,该命令对我有效

下面是一个快速演示代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "TempDir=%TEMP%\%~n0"
if exist "%TempDir%\" goto CreateFiles
md "%TempDir%" && goto CreateFiles
echo Failed to create temporary directory:
echo/
echo "%TempDir%"
echo/
pause
rem The command endlocal is executed implicit by cmd.
exit /B

:CreateFiles
pushd "%TempDir%"
echo DCIM_!01.jpeg>"%TempDir%\DCIM_!01.jpeg"
echo DCIM_^&02.jpeg>"%TempDir%\DCIM_&02.jpeg"
echo DCIM_=03.jpeg>"%TempDir%\DCIM_=03.jpeg"
echo DCIM_%%04.jpeg>"%TempDir%\DCIM_%%04.jpeg"
echo DCIM_)05.jpeg>"%TempDir%\DCIM_)05.jpeg"

:UserPrompt
set "MyString="
set /P "SearchString=String to replace: "
rem Has the user not entered a string?
if not defined SearchString goto UserPrompt
rem Remove all double quotes.
set "SearchString=%SearchString:"=%"
rem Is there no search string left?
if not defined SearchString goto UserPrompt
rem Replace all exclamation marks by vertical bars.
set "SearchString=%SearchString:!=|%"
echo/

for /F "eol=| delims=" %%I in ('dir "*.jpeg" /A-D /B 2^>nul') do (
    set "RealName=%%I"
    set "FileName=%%I"
    rem Replace in file name all exclamation marks by vertical bars.
    call set "FileName=%%FileName:!=|%%"
    setlocal EnableDelayedExpansion
    set "NewName=!FileName:%SearchString%=0!"
    if not "!NewName!" == "!FileName!" echo ren "!RealName!" "!NewName!"
    endlocal
)

echo/
%SystemRoot%\System32\choice.exe /C NY /N /M "Run once more (Y/N):"
if errorlevel 2 goto UserPrompt

popd
rd /Q /S "%TempDir%"
endlocal
您可以看到,演示代码不适用于包含
=
的搜索字符串。必须有用于替换等号的特殊代码,或者使用不同的脚本解释器,如PowerShell。
另见:

感叹号的解决方案是在搜索字符串中替换每个
|
对当前文件名执行相同操作,然后再启用延迟环境变量扩展。文件名不能包含Microsoft在“文档”页上描述的竖条。因此,更换所有
是安全的
进行编码

更换
FileName
%%
来完成FOR循环中的code>by
。原因是命令行

call set "FileName=%%FileName:!=|%%"
在执行FOR的命令之前,由
cmd.exe
处理

call set "FileName=%FileName:!=|%"
命令调用用于在循环的每次迭代中通过
cmd.exe
强制对该命令行进行第二次解析和处理,以真正对分配给环境变量
FileName
的当前字符串值进行字符替换

另见:

然后,可以启用延迟扩展,对已经稍微修改过的文件名执行字符串替换,并使用当前文件的真实名称和新文件名对字符串替换真正修改过的文件名运行命令REN。有关命令SETLOCALENDLOCAL的详细信息,请阅读


演示代码并没有真正运行命令REN,它只是输出在删除命令ECHO

时执行REN的方式。是否有理由不禁用
延迟扩展
?这样,
ren“DCIM\u%mystring:~0,1%01.jpeg”“DCIM\u 001.jpeg”
即使使用像
这样的字符也非常安全。(无法处理
但文件名无论如何不能包含引号)非常感谢。通过您的示例,我可以创建完整的批处理文件。非常感谢。我将此批处理示例留给您查看,但我无法像您一样理解此脚本。
call set "FileName=%%FileName:!=|%%"
call set "FileName=%FileName:!=|%"