我的任务是在我的头上稍微拿走文件库并从文件名中删除多余的垃圾字符并将重命名的文件保存在不同的目录文件夹中。
文件名的一个例子是:
100-expresstoll.pdf 1000-2012-09-29.jpg 10000-2014-01-15_14.03.22.jpg 10001-2014-01-15_19.05.24.jpg 10002-2014-01-15_21.30.23.jpg 10003-2014-01-16_07.33.54.jpg 10004-2014-01-16_13.33.21.jpg 10005-Feb 4, 2014.jpeg 10006-O'Reilly_Media,_Inc..pdf
开头的第一组数字是记录ID,并与文件的扩展名一起保留。记录ID和文件扩展名之间的所有其他内容都需要删除。
例如,前三个文件的最终名称为:
100.pdf 1000.jpg 10000.jpg
除了其他帖子之外,我还阅读了Removing characters和Rearranging filenames,但前面有一个可变字符长度的复杂性,要删除的可变数量的中间字符和可变文件扩展名类型除了我有限的PowerShell覆盖范围之外,我真的把它扔了。
答案 0 :(得分:3)
另一种没有正则表达式的方法。在以下两个示例中,使用风险缓解参数float horiAxis = CrossPlatformInputManager.GetAxis("Horizontal");
if (horiAxis > 0){
MoveRight(horiAxis);
}
public void MoveLeft(float val)
{
theRB.velocity = new Vector2(-moveSpeed * val, theRB.velocity.y);
}
进行调试。
重命名文件:
-WhatIf
重命名和移动文件:
Get-ChildItem -File | ForEach-Object {
$oldFile = $_.FullName
$newName = $_.BaseName.Split('-')[0] + $_.Extension
if ($_.Name -ne $newName) {
Rename-Item -Path $oldFile -NewName $newName -WhatIf
}
}
答案 1 :(得分:2)
您可以使用-replace
运算符执行此类字符串操作:
Get-ChildItem | foreach {
$old_name = $_.FullName
$new_name = $_.Name -replace '([0-9]+).*(\.[^.]*)$', '$1$2'
Rename-Item $old_name $new_name
}
正则表达式就是这里的诀窍:
([0-9]+)
表示匹配一系列数字(1位或更多位数).*
表示匹配任何内容(\.[^.]*)
表示匹配句点$
表示匹配必须到达字符串的末尾第一个和第三个是特殊的,因为它们被括号括起来,这意味着您可以在替换字符串中使用美元符号(例如$1
)来使用这些值。
答案 2 :(得分:2)
解决这个问题的最惯用的方法可能如下(假设所有感兴趣的文件 - 而不是其他文件 - 都在当前目录中。):
Get-ChildItem -File | Rename-Item -NewName { ($_.BaseName -split '-')[0] + $_.Extension }
将常用参数-WhatIf
添加到Rename-Item
命令,以预览重命名操作。
请注意Rename-Item
始终重命名当前位置的项目;要(也)移动它们,请使用Move-Item
。
如果已存在具有相同名称的目标,Rename-Item
会报告每个此类情况的非终止错误(不会中止整体处理)。
请注意,如果输入文件名不包含-
,也会发生这种情况,因为这会导致尝试将文件重命名为自身。
<强>解释强>
Get-ChildItem -File
输出表示当前目录中文件的[System.IO.FileInfo]
个对象,这些对象通过管道(|
)传递给Rename-Item
。
将脚本块({ ... }
)传递给Rename-Item
的{{1}}参数会执行每个输入对象的包含代码,其中-NewName
表示手头的输入对象。
$_
从每个输入文件名的基本名称(没有扩展名的文件名)中提取第一个($_.BaseName -split '-')[0]
- 分隔的标记。
-
,因为LHS是一个字符串,执行 string 连接。
+
从每个输入文件名中提取文件扩展名。
答案 3 :(得分:0)
我知道这不是PowerShell的事情。如果你只是想要一些工作,这是一个cmd批处理文件。
SETLOCAL ENABLEDELAYEDEXPANSION
SET "OLDDIR=C:\Users\lit\files"
SET "NEWDIR=C:\Users\lit\newdir"
FOR /F "usebackq tokens=*" %%a IN (`DIR /A:-D /B "%OLDDIR%\*"`) DO (
FOR /F "usebackq delims=- tokens=1" %%b IN (`ECHO %%a`) DO (SET "BN=%%b")
SET "EXT=%%~xa"
ECHO COPY /Y "%OLDDIR%\%%~a" "%NEWDIR%\!BN!!EXT!"
)