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
Windows 从文件夹名称中删除前n个字符_Windows_Batch File_Cmd - Fatal编程技术网

Windows 从文件夹名称中删除前n个字符

Windows 从文件夹名称中删除前n个字符,windows,batch-file,cmd,Windows,Batch File,Cmd,我是批处理的新手,我的问题如下: 我有一个很长的文件夹列表,需要从每个文件夹的名称中删除前3个字符。想想01\u Folder1、02\u Folder2、03\u Folder3等等。我试着把我在网上找到的CMD命令拼凑在一起,但是我想不出一个脚本来完成我想要它做的事情。我甚至尝试过使用VBScript,因为我更熟悉VB,但也没有找到解决方案 有没有简单的方法来解决这个问题 编辑: 这是我的尝试;这给了我一个语法错误,但由于我对CMD不够精通,我真的不明白为什么: setlocal enabl

我是批处理的新手,我的问题如下:

我有一个很长的文件夹列表,需要从每个文件夹的名称中删除前3个字符。想想01\u Folder1、02\u Folder2、03\u Folder3等等。我试着把我在网上找到的CMD命令拼凑在一起,但是我想不出一个脚本来完成我想要它做的事情。我甚至尝试过使用VBScript,因为我更熟悉VB,但也没有找到解决方案

有没有简单的方法来解决这个问题

编辑: 这是我的尝试;这给了我一个语法错误,但由于我对CMD不够精通,我真的不明白为什么:

setlocal enableextensions enabledelayedexpansion 
for /d %%i in ("%~dp0*") do (set name=%%i && ren "!name!" "!name:~3!")
endlocal

FOR命令行不起作用,因为分配给循环变量
i
是具有完整路径的目录名,因此删除前三个字符会导致从目录路径中删除驱动器号、冒号和反斜杠,而不是从目录名中删除前三个字符。此外,由于
%%i
和operator
&
之间的空格,完整的限定目录名被分配给环境变量
name

一种解决办法是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion 
for /d %%i in ("%~dp0*") do set "name=%%~nxi" && ren "%%i" "!name:~3!"
endlocal
此解决方案的缺点是,在名称或路径中带有一个或多个感叹号的目录名不会被正确处理,因为启用会导致解释
以完整目录名显示为延迟扩展环境变量引用的开始/结束

另一个解决方案非常简单,只需使用命令行即可:

@for /D %%i in ("%~dp0*_*") do for /F "tokens=1* delims=_" %%j in ("%%~nxi") do @ren "%%i" "%%k"
外部FOR在批处理文件的目录中搜索与模式
*.
匹配的非隐藏子目录

对于每个分配了完整路径到循环变量
i
For的目录名,将使用另一个For命令,该命令仅处理最后一次反冲后的字符串(没有路径的目录名),并将字符串拆分为子字符串(标记)

字符串分隔符是使用选项
delims=.
定义的下划线。选项
tokens=1*
告诉FOR将第一个以下划线分隔的字符串分配给指定的循环变量
j
,并将第一个以下划线分隔的字符串后面的一个或多个下划线后面的所有内容分配给下一个,但一个循环变量
k

的内部将忽略第一个子字符串以分号开头的目录名,作为默认的行尾字符。但在这种情况下,没有目录具有
位于其名称的开头

此命令行还有一个问题。它在以FAT32或exFAT作为文件系统的驱动器上不起作用,只是碰巧在使用NTFS文件系统的驱动器上起作用。原因是文件系统中的非隐藏目录列表会发生更改,而外部的FOR会迭代匹配该模式的目录项

更好的解决方案是先将要重命名的目录列表加载到正在处理批处理文件的Windows命令进程的内存中,然后再开始重命名目录

@for /F "delims=" %%i in ('dir "%~dp0*_*" /AD-H /B 2^>nul') do for /F "tokens=1* delims=_" %%j in ("%%i") do @ren "%~dp0%%i" "%%k"
FOR在本例中在后台执行另一个命令进程,其中
%ComSpec%/c
中的命令行作为附加参数附加。因此,Windows安装到
C:\Windows
,在后台执行:

C:\Windows\System32\cmd.exe /c dir "C:\Batch\File\Path\*_*" /AD-H /B 2>nul
DIR在批处理文件的目录中搜索

  • 由于选项
    /AD-H
    (属性目录且不隐藏)而导致非隐藏目录
  • 匹配通配符模式
    *.*
  • 并且只以裸格式输出目录名,因为选项
    /B
    没有处理后台命令进程的STDOUT(标准输出)的路径
阅读有关的Microsoft文档,以了解有关nul的说明。当Windows命令解释器在执行
FOR
的命令之前处理此命令行时,重定向操作符
必须在上用插入符号
^
转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动

对于,处理批处理文件的Windows命令进程分别捕获写入后台命令进程标准输出句柄的所有内容,并在启动
cmd.exe
后按上述方式开始处理。因此,内存中已经有一个目录名列表,因此执行的REN命令不再会导致一个接一个地处理目录名列表的更改

请注意,两种单行解决方案都会将开头名为
01\u下划线的目录重命名为开头名为
下划线的目录,而不是开头名为
\u下划线的目录

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • 获取/?
  • ren/?
  • 设置/?
  • setlocal/?

两个问题:向变量添加不需要的空格。使用
设置“name=%%i”
可避免此情况。第二:代码返回一个完全限定的文件名(
C:\path\to\xx\u Folder1
)。您删除的三个字符是“C:\”。请参阅
以获取/?
,尤其是“修改器”部分,然后使用
。。。设置“name=%%~ni”&ren“%%i”!name:~3!%%~xi”
(或者使用@Mofi的建议,这更安全)哇,回答太好了,非常感谢!我肯定会不止读一次!