Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Shell 创建批处理以基于父目录中的文件名重命名文件_Shell_Variables_Powershell_Cmd_Command - Fatal编程技术网

Shell 创建批处理以基于父目录中的文件名重命名文件

Shell 创建批处理以基于父目录中的文件名重命名文件,shell,variables,powershell,cmd,command,Shell,Variables,Powershell,Cmd,Command,我有一个包含几百个文件夹的目录。每个文件夹都有一个*.iso文件和一个名为“Disc Art”的文件夹。光盘艺术文件夹内有一个*.btw文件,通常命名为1.btw或01.btw。我希望能够在父文件夹中将.btw的文件名更改为*.iso的文件名,并将“-Disc 01”添加到其中。因此,如果我有“Windflyers.iso”,我将以“Windflyers-Disc 01.btw”结束 以下是我到目前为止所做的尝试。我相信我很接近。出于某种原因,我觉得SET命令失败了,因为当我调用下一行中的变量来

我有一个包含几百个文件夹的目录。每个文件夹都有一个*.iso文件和一个名为“Disc Art”的文件夹。光盘艺术文件夹内有一个*.btw文件,通常命名为1.btw或01.btw。我希望能够在父文件夹中将.btw的文件名更改为*.iso的文件名,并将“-Disc 01”添加到其中。因此,如果我有“Windflyers.iso”,我将以“Windflyers-Disc 01.btw”结束

以下是我到目前为止所做的尝试。我相信我很接近。出于某种原因,我觉得SET命令失败了,因为当我调用下一行中的变量来重命名文件时,没有值

for /D %%f in (*.*) do (    
cd "%%f"
for /F %%a in ('dir /b *.iso') do set variable=%%~na
rename "Disc Art\*.btw" "%variable% - Disc 01.btw"
cd..
)
我也尝试过这一点,正如有人在我的工作中建议的那样

setlocal enabledelayedexpansion
for /D %%f in (*.*) do (    
cd "%%f"
for /F %%a in ('dir /b *.iso') do set variable=%%~na
rename "Disc Art\*.btw" "%variable% - Disc 01.btw"
cd..
) >> log.txt
endlocal
谢谢
我对下面的解决方案做了一点修改。dbenham的解决方案有效,但如果.iso文件名中包含空格,它只会给我第一个单词。我可以使用下面的.bat代码获得完整的文件名

for /D %%f in (*.*) do (    
cd "%%f"
for /F "tokens=*" %%* in ('dir /b *.iso') do rename "Disc Art\*.btw" "%%~n* - Disc 01.btw"
cd..
) >> log.txt

集合正在工作,但您不能在代码块内设置值,然后使用
%variable%
访问同一块内的值,因为在执行任何操作之前,整个块都会在解析时展开。通过启用延迟扩展并使用
,您可以获得所需的值!变数取而代之。但这不是必需的,因为您甚至不需要变量:

for /D %%f in (*.*) do (    
  cd "%%f"
  for /F %%a in ('dir /b *.iso') do rename "Disc Art\*.btw" "%%~na - Disc 01.btw"
  cd..
) >> log.txt
有一个更简单的解决方案

(for /r %%F in (*.iso) do ren "%%~dpDisc Art\*.btw" "%%~nF - Disc 01.btw")>log.txt

因此,
.iso
位于
.btw
文件的父文件夹中?您能简化这个问题吗?听起来好像您正在尝试重命名父文件夹和子文件,这是否正确?谢谢dbenham!你的解决方案正是我想要的。您的第一个代码和简化的代码都能完美地完成预期的任务。