Replace 用另一个字符串替换字符串

Replace 用另一个字符串替换字符串,replace,cmd,rename,Replace,Cmd,Rename,我想把这个月换成另一个月,而其他一切都保持不变。 我有上百个文件,我想在CMD中使用重命名函数 我以前的文件是苹果2018年10月香蕉.xlsx,我想把它改成苹果2018年11月香蕉.xlsx 我得到的最接近的是使用Ren*oct*.xlsx“*11月18日香蕉*”.xlsx 但我得到的回报是apple.xlsx 但是,我不能完全替换Oct 请尝试ren*.xlsx????Nov??????* *是匹配每个“.xlsx”扩展名的通配符 ?是一个通配符,用于使原始文件中的每个字符保持不变。请尝试r

我想把这个月换成另一个月,而其他一切都保持不变。 我有上百个文件,我想在CMD中使用重命名函数

我以前的文件是苹果2018年10月香蕉.xlsx,我想把它改成苹果2018年11月香蕉.xlsx

我得到的最接近的是使用
Ren*oct*.xlsx“*11月18日香蕉*”.xlsx
但我得到的回报是
apple.xlsx


但是,我不能完全替换Oct

请尝试
ren*.xlsx????Nov??????*

*
是匹配每个“.xlsx”扩展名的通配符


是一个通配符,用于使原始文件中的每个字符保持不变。

请尝试
ren*.xlsx?????Nov?????。

*
是匹配每个“.xlsx”扩展名的通配符


是一个通配符,用于使原始文件中的每个字符保持不变。

因为batch只知道变量类型字符串ad在日期时间计算中不好,
我建议为此使用PowerShell

  • [datetime]类型和类型
  • .AddMonths()
    方法
  • 基于正则表达式的
    -match
    运算符
它甚至可以跨越年份界限:

## Q:\Test\2018\12\13\SO_53757192.ps1
$CI = [cultureinfo]::InvariantCulture
$dt = ' MMM\''yy '
Get-ChildItem '* ???''[0-9][0-9] *.xlsx' |
  Where-Object BaseName -match ' (Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)''(\d{2}) ' |
    Rename-Item -NewName {$_.Name -replace $Matches[0],
      [datetime]::ParseExact($matches[0],$dt,$CI).AddMonths(1).ToString($dt)} # -WhatIf
您可以从批处理中将其作为文件调用

powershell -NoP -Ex bypass -File ".\SO_53757192.ps1"
或者把它塞进一行

powershell -NoP -C "$CI=[cultureinfo]::InvariantCulture;$dt=' MMM\''yy ';Get-ChildItem '* ???''[0-9][0-9] *.xlsx'|Where-Object BaseName -match ' (Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)''(\d{2}) '|Rename-Item -NewName {$_.Name -replace $Matches[0],[datetime]::ParseExact($matches[0],$dt,$CI).AddMonths(1).ToString($dt)}"

由于batch只知道变量类型字符串ad在日期时间计算方面不好,
我建议为此使用PowerShell

  • [datetime]类型和类型
  • .AddMonths()
    方法
  • 基于正则表达式的
    -match
    运算符
它甚至可以跨越年份界限:

## Q:\Test\2018\12\13\SO_53757192.ps1
$CI = [cultureinfo]::InvariantCulture
$dt = ' MMM\''yy '
Get-ChildItem '* ???''[0-9][0-9] *.xlsx' |
  Where-Object BaseName -match ' (Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)''(\d{2}) ' |
    Rename-Item -NewName {$_.Name -replace $Matches[0],
      [datetime]::ParseExact($matches[0],$dt,$CI).AddMonths(1).ToString($dt)} # -WhatIf
您可以从批处理中将其作为文件调用

powershell -NoP -Ex bypass -File ".\SO_53757192.ps1"
或者把它塞进一行

powershell -NoP -C "$CI=[cultureinfo]::InvariantCulture;$dt=' MMM\''yy ';Get-ChildItem '* ???''[0-9][0-9] *.xlsx'|Where-Object BaseName -match ' (Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)''(\d{2}) '|Rename-Item -NewName {$_.Name -replace $Matches[0],[datetime]::ParseExact($matches[0],$dt,$CI).AddMonths(1).ToString($dt)}"

我认为单靠一个
ren
命令行是无法完成任务的

您可以使用以下代码编写批处理文件,并将其命名为
renu date.bat

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_ROOT=。”&rem//(根目录,`.`是当前目录,`%~dp0.`是父目录)
设置“_FROM=%~1”&rem//(要替换的名称部分;`%~1`是第一个参数)
将“_设置为=%~2”&rem//(要插入的名称部分;`%~2`是2st参数)
rem//枚举所有匹配的文件(注意星号后面的空格):
对于/F“delims=| eol=|”%%J in('dir/B/A:-D“%\u ROOT%\*%\u FROM%*.xlsx”'),请执行以下操作:(
rem//存储当前文件名,为新名称初始化变量:
设置“文件=%%J”&设置“名称=”
rem//切换延迟扩展以避免感叹号丢失:
setlocal EnableDelayedExpansion
rem/*将当前文件名中的每个空格替换为````并将
rem在```之间的整个字符串,因此我们得到一个引用项列表,
rem,反映所有以空格分隔的文件名部分:*/
对于(“!文件:=”!”)中的%%I,请执行以下操作(
端部
rem//存储当前文件名部分:
设置“PART=%%~I”
setlocal EnableDelayedExpansion
rem/*组装新名称,执行预期的
rem预定义的子字符串;需要'for/F'循环来传输
将生成的新文件名rem越过“endlocal”障碍:*/
对于/F“delims=| eol=|”%%K in(“!NAME!!PART:%\u FROM%=%\u TO%!”)执行以下操作(
端部
rem//存储组合的名称部分:
设置“名称=%%K”
setlocal EnableDelayedExpansion
)
)
rem//现在将文件重命名为新名称:
ren“!\u ROOT!\!FILE!”!名称:~1!”
端部
)
端部
退出/B
然后使用以下命令行在
cmd
中运行它,前提是您位于包含要重命名的文件的目录中:

ren_date.bat“2018年10月”“2018年11月”
参考中的示例,这应重命名文件:

和一些梨,10月18日
苹果十月十八日
香蕉十月十八日
更多水果2018年10月xyz.xlsx
橘子十月十八日
加上2018年10月18日的桃子
草莓2018年10月abcdef.xlsx
对这些人:

和一些梨,11月18日
苹果公司11月18日.xlsx
香蕉11月18日.xlsx
更多水果11月18日xyz.xlsx
橘子11月18日
加上18年11月的桃子
草莓2018年11月abcdef.xlsx

(我认为,直接在
cmd
中将上述代码写入命令行是不可能的,特别是由于切换延迟扩展以确保代码安全。)

我认为单靠一个
ren
命令行无法完成您的任务

您可以使用以下代码编写批处理文件,并将其命名为
renu date.bat

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_ROOT=。”&rem//(根目录,`.`是当前目录,`%~dp0.`是父目录)
设置“_FROM=%~1”&rem//(要替换的名称部分;`%~1`是第一个参数)
将“_设置为=%~2”&rem//(要插入的名称部分;`%~2`是2st参数)
rem//枚举所有匹配的文件(注意星号后面的空格):
对于/F“delims=| eol=|”%%J in('dir/B/A:-D“%\u ROOT%\*%\u FROM%*.xlsx”'),请执行以下操作:(
rem//存储当前文件名,为新名称初始化变量:
设置“文件=%%J”&设置“名称=”
rem//切换延迟扩展以避免感叹号丢失:
setlocal EnableDelayedExpansion
rem/*将当前文件名中的每个空格替换为````并将
rem在```之间的整个字符串,因此我们得到一个引用项列表,
rem,反映所有以空格分隔的文件名部分:*/
对于(“!文件:=”!”)中的%%I,请执行以下操作(
端部
rem//存储当前文件名部分:
设置“PART=%%~I”
setlocal EnableDelayedExpansion
rem/*组装新名称,执行预期的
rem预定义的子字符串;f