我正在尝试在powershell中编写一个脚本来删除文件夹中每个MP3文件名的前20个字符,我创建了一个文件'test.ps'并将powershell代码插入其中,
gci *.mp3 | rename-item -newname { [string]($_.name).substring(20) }
当我在powershell.exe中运行此文件时,没有任何反应,
有人可以帮忙吗?感谢。
答案 0 :(得分:6)
这可能会让你入门。 (可能有更简洁的方法,但是当你需要在以后维护它时,它可以工作并且是可读的。:-))
我创建了一个文件夹C:\TempFiles
,并在该文件夹中创建了以下文件:
TestFile1.txt
TestFile2.txt
TestFile3.txt
TestFile4.txt
(我以老式的方式创造了它们,我很害怕。< g>。我用过
for /l %i in (1,1,4) do echo "Testing" > TestFile%i.txt
来自实际的命令提示符。)
然后我从开始菜单中打开PowerShell ISE
,然后运行此脚本。它创建一个数组($files
),只包含文件的名称,并处理每个文件:
cd \TempFiles
$files = gci -name *.txt
foreach ($file in $files) {
$thename = $file.substring(4);
rename-item -path c:\TempFiles\$file -newname $thename
}
这使文件夹包含:
File1.Txt
File2.Txt
File3.Txt
File4.Txt
File5.Txt
要从命令行运行脚本,您需要更改一些默认的Windows安全设置。您可以使用PowerShell ISE
的帮助文件(从菜单中)搜索about_scripts
或从help about_scripts
提示符执行ISE
来了解相关信息。请参阅帮助文件中的How To Run A Script
小节(更容易阅读)。
答案 1 :(得分:2)
您的代码确实有效。两件事......
test.ps1
。Get-ChildItem
的路径,它将在当前目录中运行。我通过制作一堆像这样的mp3文件来测试你的行 -
1..30 | % { new-item -itemtype file -Name (
$_.ToString().PadLeft(30, 'A') + ".mp3" )}
答案 2 :(得分:0)
我会使用更“安全”的方式(如果文件名比有问题的长度短,你会收到错误,你也将文件扩展名作为总字符的一部分)。检查每个文件的基本名称是否大于21个字符(如果删除前20个字符,则它仍然可以包含一个字符长的名称)。如果在删除前20个目录后包含具有相同名称的文件,则可能会失败,您可以自行开发它:)
gci *.mp3 | foreach{
if($_.BaseName.Length -ge 21)
{
$ext = $_.Extension
$BaseName = $_.BaseName.Substring(20)
Rename-Item $_ -NewName "$BaseName$ext"
}
}
答案 3 :(得分:0)
//删除(替换为空字符)所有文件名中的前20个章程以“dbo”开头。 // powershell
Get-ChildItem C:\my_dir\dbo -Recurse -Force -Filter dbo.* | Where-Object {!$_.PSIsContainer} | Rename-Item -NewName { ($_.name).Substring(20) }