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