Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/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
powershell文件和子文件夹文件重命名_Powershell - Fatal编程技术网

powershell文件和子文件夹文件重命名

powershell文件和子文件夹文件重命名,powershell,Powershell,我对powershell非常陌生,现在已经阅读了太多的示例,并且用Get ChildItem示例让我头脑发热 我的电影有一个文件夹结构,如下所示 Films ├─Film1 | Film1Name.mp4 │ └─Subs │ └─English.SRT │ ├─Film2 | Film2Name.mp4 │ └─Subs │ └─English.SRT | ├─Film3 | Film3Name.mp4 │ └─Subs │ └─English.SRT 我试图实现的是重命名*.s

我对powershell非常陌生,现在已经阅读了太多的示例,并且用Get ChildItem示例让我头脑发热

我的电影有一个文件夹结构,如下所示

Films
├─Film1
| Film1Name.mp4
│ └─Subs
│   └─English.SRT
│
├─Film2
| Film2Name.mp4
│ └─Subs
│   └─English.SRT
|
├─Film3
| Film3Name.mp4
│ └─Subs
│   └─English.SRT
我试图实现的是重命名*.srt文件并将其上移到文件夹级别,然后重命名为电影的文件名或电影的文件夹名,并在扩展名之前将.ENG插入.srt文件名。 然后删除未使用的“Subs”文件夹,并递归执行此操作

根据文件名,以以下内容结束

├─Film1
| Film1Name.mp4
│ Film1Name.ENG.SRT
或者根据文件夹名称进行设置

├─Film1
| Film1.mp4
│ Film1.ENG.SRT
任何帮助都将不胜感激,任何一种方法都会奏效

我在玩别人的帖子里的代码,然后把我的测试文件夹都删除了

$rootPath = "c:\Test"

Get-ChildItem -Path $rootPath -Directory | ForEach-Object {
 
    $targetFolder = $_.FullName
    Resolve-Path "$targetFolder\*" | ForEach-Object {
        Move-Item -Path "$_\*.SRT" -Destination $targetFolder -Force
        Remove-Item -Path $_
    }
}

据我所知,你知道你有多少文件夹(电影),然后这可能会工作:

1..3|ForEach {Copy-Item -Path C:\Films\Film$_\Subs\English.srt -Destination C:\Films\Film$_\Film$_.ENG.SRT} 
1..3|ForEach {Remove-Item -Path C:\Films\Film$_\Subs -Recurse -Force}

首先,在设置根目录后,您希望获得以“电影”命名的所有顶级目录的列表

设置位置-路径“此处的目录路径”
$Films=获取子项-目录
一旦我们完成了这项工作,我们将遍历每个目录,将该位置推送到该目录,并检查是否存在一个名为“Subs”的文件夹<代码>弹出位置在完成需要执行的操作后,将我们返回到上一个位置

foreach($Film in$Films){
推送位置$Film
if((getchilditem-Directory).Name-包含“Subs”){
#做事
}
流行位置
}
如果我们找到一个“Subs”目录,我们要检查是否存在“.SRT”文件。我们可能有多种语言的字幕

$Subs=Get ChildItem-Path*.srt-Recurse
检查
$Subs
是否不为空

if($null-ne$Subs){}
将任何“.SRT”文件移动到当前位置,并按指定重命名它们

foreach($Sub中的$Subs){
$FilmPath=$Film.Fullname
$FilmName=$Film.Name
$SubtitleLang=$Sub.BaseName.Substring(0,3).ToUpper()
$Extension=$Sub.Extension
移动项目-路径$子目标“$FilmPath\$FilmName.$SubtitleLang$扩展名”
}
如果您完全确定要删除“Subs”文件夹,我们将首先检查它是否为空。如果仍有文件,我们可以编写消息

$RemainingFiles=Get ChildItem-Path Subs-Recurse
如果($null-eq$RemainingFiles){
移除项目-路径子项-强制
}
否则{
写入警告“在$($Film.FullName)\Subs中仍有文件”
}
把它们放在一起

设置位置-路径“此处的目录路径”
$Films=获取子项-目录
#循环浏览电影
foreach($电影中的电影){
推送位置$Film
if((getchilditem-Directory).Name-包含“Subs”){
#在“Subs”目录中查找任何SRT文件
$Subs=Get ChildItem-Path Subs/*.srt-Recurse
如果($null-ne$Subs){
foreach($Sub中的Sub){
$FilmPath=$Film.Fullname
$FilmName=$Film.Name
$SubtitleLang=$Sub.BaseName.Substring(0,3).ToUpper()
$Extension=$Sub.Extension
移动项目-路径$子目标“$FilmPath\$FilmName.$SubtitleLang$扩展名”
}
}
}
#删除Subs文件夹
$RemainingFiles=获取子项-路径子项-递归
如果($null-eq$RemainingFiles){
移除项目-路径子项-强制
}
否则{
写入警告“在$($Film.FullName)\Subs中仍有文件”
}
#返回到下一个文件夹的根目录。
流行位置
}

感谢您尝试使用此功能,我的文件夹中包含了一个名为“.ENG.SRT”的文件,并删除了所有其他文件和文件夹。首先感谢您的回答、解释和详细说明。它开始帮助我了解更多。它没有将.SRT文件重命名为“Film1.ENG.SRT”,只是重命名为“Film1”,没有扩展名。此外,是否可以同时将电影文件名重命名为文件夹名,并使用文件名原始扩展名?根据语言的前三个字母进行更新,以重命名字幕。对于英语,这将是您问题中指定的英语。更改电影文件名对我来说是未知的,如果它与文件夹名称不同。您可以将其命名为任何名称,您可能有不同的媒体类型,可能有多个媒体文件,等等。非常感谢,我需要阅读一些powershell书籍。现在获取一个错误,如下所示。只有一个.srt文件,并且可能不总是以ENG开头,因此可以只更改$SubtitleLang=“ENG”'移动项:找不到路径的一部分。在第15行,字符数为17+。。。移动项目-路径$Sub-Destination“$Film\$FilmName.$Subti…+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:WriteError:(C:\Test\Film1\Subs\english.srt:FileInfo)[移动项目],DirectoryNotFoundException'谢谢你,它很有效,正如我说的,我可以用BRU重命名电影名。非常感谢。节省了我很多手动操作的时间。