Powershell 如何使用另一个目录重命名未知目录下的文件';姓名

Powershell 如何使用另一个目录重命名未知目录下的文件';姓名,powershell,batch-file,cmd,Powershell,Batch File,Cmd,我需要根据未知目录名下的目录名重命名文件(或将其复制为新名称) 我有很多有日期的文件夹,有子目录。在每个子目录下,都有一个名为index.txt的文件。该txt文件需要重命名或复制到其上方目录的名称。每个子目录的名称都是已知的,以便在必要时可以在脚本中使用 例如: 我需要最终结果如下所示: C:\Test\20170414124512\Directory1\Directory1.txt C:\Test\20170414124512\Directory2\Directory2.txt C:\Te

我需要根据未知目录名下的目录名重命名文件(或将其复制为新名称)

我有很多有日期的文件夹,有子目录。在每个子目录下,都有一个名为
index.txt
的文件。该txt文件需要重命名或复制到其上方目录的名称。每个子目录的名称都是已知的,以便在必要时可以在脚本中使用

例如:

我需要最终结果如下所示:

  • C:\Test\20170414124512\Directory1\Directory1.txt
  • C:\Test\20170414124512\Directory2\Directory2.txt
  • C:\Test\20170414124512\Directory3\Directory3.txt
  • C:\Test\20170414134345\Directory1\Directory1.txt
  • C:\Test\20170414134345\Directory2\Directory2.txt
  • C:\Test\20170414134345\Directory3\Directory3.txt
**对不起,我应该包括我试过的。这是我尝试过的,但没有成功


对于/D/R“C:\Test”%%a in(*)do echo ren“%%a\index.txt”“%%~Na.txt”

类似的操作应该可以完成。 如果你想要的话,你也可以把它移到别的地方。 这是一个powershell脚本

foreach($folder in Get-ChildItem -Path "C:\Temp" -Recurse)
{
    if ($folder -is [System.IO.DirectoryInfo])
    {
        if($folder.Name -contains "Your Foldername")
        {
            $path = $folder.FullName
            Rename-Item "$path\index.txt" -NewName "Newname.txt"
        }
    }
}

要避免尝试重命名不存在的index.txt文件,aschipl建议的附加if应执行以下操作:

@Echo off
for /D %%J in ("C:\Test\*"
  ) do for /D %%I in ("%%~fJ\*"
  ) do (
   If exist "%%~fI\index.txt" Echo ren "%%~fI\index.txt" "%%~nI.txt"
)
如果输出看起来正常,请删除最后一行中的回声:

ren "C:\Test\20170414124512\Directory1\index.txt" "Directory1.txt"
ren "C:\Test\20170414124512\Directory2\index.txt" "Directory2.txt"
ren "C:\Test\20170414124512\Directory3\index.txt" "Directory3.txt"
ren "C:\Test\20170414134345\Directory1\index.txt" "Directory1.txt"
ren "C:\Test\20170414134345\Directory2\index.txt" "Directory2.txt"
ren "C:\Test\20170414134345\Directory3\index.txt" "Directory3.txt"
如果你愿意,所有这些都可以在一条线上。我使用
u:\sourcedir\
作为测试目录,所需的REN命令仅用于测试目的验证命令是否正确后,将
ECHO-REN
更改为
REN
,以实际重命名文件

请注意,直接从提示符执行和作为批处理文件的行执行是不同的。如果从命令提示符执行,
元变量(循环控制变量)
%%x
必须被引用为批处理行的
%%x
,并且
%x
。由于在提示符下重复执行包含
行没有什么意义(创建批处理文件更容易),因此我发布了批处理文件版本。如果需要,用户有责任调整直接从提示


在内存中,以
/b
基本格式
/s
创建目录列表,扫描子目录
/a-d
,但不传递与
index.txt
匹配的文件的目录名。将每个名称分配给
%%a
(“delims=”通过关闭默认分隔符确保分配整行)。通过在
%%a
%%~dpa
)的驱动器和路径部分重复解析操作来检测directoryname,该部分通过添加
使其看起来像文件名。然后使用from name(全部
%%a
)和to name(仅名称和扩展名)构造
ren
命令,使用
%%r
的“名称部分”和
%%a
的扩展部分(我们实际上知道的是
.txt
,因为这是
dir
命令中指定的)-所有这些都整齐地用引号括起来,以便
ren
能够在语法上处理分隔符,例如名称中任何地方出现的空格被篡改。

到目前为止您尝试了什么,您遇到了什么问题?提示:查看并学习使用其
/D
选项以及
~
修饰符;在命令提示窗口中键入
以获取/?
,然后阅读帮助文本。起点:
for/D%%J in(“C:\Test\*”)do for/D%%I in(“%%~fJ\*”)do ren“%%~fI\index.txt”%%~nI.txt”
ren "C:\Test\20170414124512\Directory1\index.txt" "Directory1.txt"
ren "C:\Test\20170414124512\Directory2\index.txt" "Directory2.txt"
ren "C:\Test\20170414124512\Directory3\index.txt" "Directory3.txt"
ren "C:\Test\20170414134345\Directory1\index.txt" "Directory1.txt"
ren "C:\Test\20170414134345\Directory2\index.txt" "Directory2.txt"
ren "C:\Test\20170414134345\Directory3\index.txt" "Directory3.txt"
FOR /f "delims=" %%a IN (
 'dir /b /s /a-d "u:\sourcedir\index.txt" '
 ) DO (
 FOR /f "delims=" %%r IN ("%%~dpa.") DO ECHO REN "%%a" "%%~nr%%~xa"
)