如何使用另一个目录的名称

时间:2017-04-14 17:50:44

标签: powershell batch-file cmd

我需要根据目录名重命名文件(或将其复制到新名称),该名称位于未知目录名下。

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

例如:

>Tree C:\Test /f
C:\TEST
├───20170414124512
│   ├───Directory1
│   │       index.txt
│   │
│   ├───Directory2
│   │       index.txt
│   │
│   └───Directory3
│           index.txt
│  
└───20170414134345
    ├───Directory1
    │       index.txt
    │
    ├───Directory2
    │       index.txt
    │
    └───Directory3
            index.txt

我需要最终结果如下:

  • C:\测试\ 20170414124512 \ directory1中\ Directory1.txt
  • C:\测试\ 20170414124512 \ Directory2 \ Directory2.txt
  • C:\测试\ 20170414124512 \ directory3目录\ Directory3.txt
  • C:\测试\ 20170414134345 \ directory1中\ Directory1.txt
  • C:\测试\ 20170414134345 \ Directory2 \ Directory2.txt
  • C:\测试\ 20170414134345 \ directory3目录\ Directory3.txt

**对不起,我应该把我尝试的内容包括在内。这是我尝试过的,但是没有用。

/ D / R" C:\ Test" %% a in(*)do echo ren" %% a \ index.txt" " %%〜Na.txt"

3 个答案:

答案 0 :(得分:0)

这样的事情应该这样做。 如果你想要的话,你可以把它移到别的地方。 这是一个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"
        }
    }
}

答案 1 :(得分:0)

为了避免尝试重命名非现有的index.txt文件,如果要aschipl的建议应该添加:

@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"

答案 2 :(得分:0)

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"
)

如果您愿意,所有这些都可以在一条线上。我使用u:\sourcedir\作为测试目录,所需的REN命令仅用于ECHO以进行测试。 在您确认命令正确后,将ECHO REN更改为REN以实际重命名文件。

请注意,直接从提示执行和作为批处理文件的行是不同的。对于批处理行,metavariable(循环控制变量)%%x必须引用为%%x,如果从命令提示符执行,则%x必须引用for。由于从提示中重复执行包含/b的行没有意义(创建批处理文件更容易),我发布了批处理文件版本。如果需要,用户有责任根据提示进行调整。

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