Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 如何仅重命名子文件夹而不更改父文件夹名称_Windows_Batch File - Fatal编程技术网

Windows 如何仅重命名子文件夹而不更改父文件夹名称

Windows 如何仅重命名子文件夹而不更改父文件夹名称,windows,batch-file,Windows,Batch File,我有一个包含数百个子文件夹的文件夹,格式为Name,ID。每个文件夹都包含多个子文件夹,其中一些文件夹的名称中包含空格。我只想通过用下划线替换空格来重命名子文件夹而不是父文件夹,例如将C:\Location\John,1234\My Documents改为C:\Location\John,1234\My_Documents 我试图修改我在这里找到的一段脚本,但它也改变了父文件夹 以下是未经编辑的代码: @echo off setlocal EnableExtensions DisableDela

我有一个包含数百个子文件夹的文件夹,格式为
Name,ID
。每个文件夹都包含多个子文件夹,其中一些文件夹的名称中包含空格。我只想通过用下划线替换空格来重命名子文件夹而不是父文件夹,例如将
C:\Location\John,1234\My Documents
改为
C:\Location\John,1234\My_Documents

我试图修改我在这里找到的一段脚本,但它也改变了父文件夹

以下是未经编辑的代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "StartFolder=C:\Tydelik"

cd /D %SystemRoot%
set "RenameError="

rem Rename all folders containing at least one space character in folder name.
for /F "delims=" %%I in ('dir "%StartFolder%\* *" /AD /B /S 2^>nul') do call :RenameFolder "%%I"

if defined RenameError echo/& pause
rem Restore initial environment and exit this batch file.
endlocal
goto :EOF


:RenameFolder
set "NewFolderName=%~nx1"
set "NewFolderName=%NewFolderName: =_%"

set "FolderPath=%~dp1"
if not exist "%FolderPath%" set "FolderPath=%FolderPath: =_%"
set "FullFolderName=%FolderPath%%~nx1"
if not exist "%FullFolderName%\" set "RenameError=1" & goto :EOF

for %%J in ("%FullFolderName%") do set "FolderAttributes=%%~aJ"
if "%FolderAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe -h "%FullFolderName%"

ren "%FullFolderName%" "%NewFolderName%" 2>nul
if errorlevel 1 goto ErrorFolderRename

if "%FolderAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe +h "%FolderPath%%NewFolderName%"
goto :EOF

:ErrorFolderRename
echo Error renaming folder "%FullFolderName%"
set "RenameError=1"
if "%FolderAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe +h "%FullFolderName%"
goto :EOF

正如我所说,每个子文件夹的预期输出应该是
C:\Location\John,1234\My_Documents
,而不是
C:\Location\John,1234\My Documents
。目前,在我的代码中,我得到了
C:\Tydelik\John,\u 1234\My\u Documents
以下是一个我认为您正在寻找的示例,基于这样一个事实,即您只对重命名
“C:\Tydelik\Name,ID”
的子目录感兴趣,而不是这些子目录中包含的任何子目录:

@Echo关闭
SetLocal DisableDelayedExpansion
设置“SourceDir=C:\Tydelik”
对于/F“EOL=?Delims=“%%A In('Dir/B/AD”%SourceDir%%“2^>NUL”
)是否在中设置“TargetDir=“&For/F”EOL=?Delims=“%%B”(
'Dir/B/AD“%SourceDir%\%%A”2^>numl')Do(设置“TargetDir=%%B”
SetLocal EnableDelayedExpansion
如果不是“!TargetDir:=!”=“!TargetDir!”(
Ren“%SourceDir%\%%A\%%B”“!TargetDir:=\\!)
(本地)

当Compo的解决方案将文件夹重命名为“depth=2”时,只会重命名“leaves”(树的最后一个文件夹,“depth=last”)。我保留了您的
呼叫
方法,以避免延迟扩展和可能导致的问题(文件夹名称带有
-在您的情况下不太可能,但人们永远不知道…)


注意:出于安全原因,我仅通过回显禁用了
ren
命令。如果它按预期工作,请删除
ECHO

是否总是要在“leaves”(最下面的子文件夹,下面没有其他文件夹)处替换空间?是的,这是正确的。如果要在
C:\Tydelik\Name,ID下面的所有子目录级别用下划线替换所有空间“
您可能需要确定每个分支的最低级别,并在提升级别时重命名每个分支。想象一下拥有
C:\Tydelik\John,1234\My Documents\Work Files
,如果您的代码首先重命名
My Documents
,即
C:\Tydelik\John,1234\My\u Documents
,那么最初解析的子目录
C:\Tydelik\John,1234\My Documents\Work Files
将不再存在,因为它将是
C:\Tydelik\John,1234\My\u Documents\Work Files
。因此,
工作文件
可能需要首先处理。我刚刚快速检查了所有文件夹的最低级别是C:\Tydelik\John,1234\X,其中X是我的文档、图片、视频等。下面没有其他文件夹。
@echo off
setlocal
set "sourcedir=..\..\"
for /f "delims=" %%I in ('dir "%sourcedir%" /ad /b /s 2^>nul') do call :RenameFolder "%%I"
goto :eof

:RenameFolder
dir /ad /b /s "%~1" 2>nul | find /v "" >nul && goto :eof  ::skip renaming, if a subfolder exists
set "leaf=%~nx1"
ECHO ren "%~1" "%leaf: =_%"
goto :eof