英文:
Error renaming text files based on the first line in the file in Powershell
问题
以下是翻译好的部分:
"我正在尝试根据第一行来重命名大量的纯文本文件。我遇到的问题是有些第一行包含无效字符(路径中的非法字符),因此会导致错误。这是我正在使用的代码:
$files = Get-ChildItem *.txt
$file_map = @()
foreach ($file in $files) {
$file_map += @{
OldName = $file.Fullname
NewName = "{0}.txt" -f $(Get-Content $file.Fullname | select -First 1)
}
}
$file_map | % { Rename-Item -Path $_.OldName -NewName $_.NewName }
是否有一种方法可以在重命名时忽略特殊字符?
谢谢。"
英文:
I'm trying to rename a large number of plain text files based on the first line. The issue I'm encoutering is that some first lines have invalid characters (illegal characters in path) so I get errors. This is what I'm using:
$files = Get-ChildItem *.txt
$file_map = @()
foreach ($file in $files) {
$file_map += @{
OldName = $file.Fullname
NewName = "{0}.txt" -f $(Get-Content $file.Fullname| select -First 1)
}
}
$file_map | % { Rename-Item -Path $_.OldName -NewName $_.NewName }
Is there a way to ignore special characthers when renaming?
Thanks.
答案1
得分: 1
以下可能适用于您。基本上,您可以使用Path.GetInvalidFileNameChars
方法 来获取文件名中的无效字符的字符数组,然后创建一个正则表达式模式来移除这些无效字符:
$invalidChars = ([IO.Path]::GetInvalidFileNameChars() |
ForEach-Object { [regex]::Escape($_) }) -join ''|'';
Get-ChildItem *.txt | Rename-Item -NewName {
$firstLine = ($_ | Get-Content -TotalCount 1) -replace $invalidChars
''{0}.txt'' -f $firstLine
}
也许一个更简单的方法是移除任何非单词字符 \W
:
Get-ChildItem *.txt | Rename-Item -NewName {
$firstLine = ($_ | Get-Content -TotalCount 1) -replace ''\W''
''{0}.txt'' -f $firstLine
}
或者移除不在字符范围 a-z
, A-Z
, 0-9
或空格
内的任何字符:
Get-ChildItem *.txt | Rename-Item -NewName {
$firstLine = ($_ | Get-Content -TotalCount 1) -replace ''[^a-z0-9 ]''
''{0}.txt'' -f $firstLine
}
英文:
The following might work for you. Essentially, you can use the Path.GetInvalidFileNameChars
Method to get a char array of those invalid characters for a file name then create a regex pattern to remove those invalid chars:
$invalidChars = ([IO.Path]::GetInvalidFileNameChars() |
ForEach-Object { [regex]::Escape($_) }) -join '|'
Get-ChildItem *.txt | Rename-Item -NewName {
$firstLine = ($_ | Get-Content -TotalCount 1) -replace $invalidChars
'{0}.txt' -f $firstLine
}
Perhaps an easier approach would be to remove any Non-word character with \W
:
Get-ChildItem *.txt | Rename-Item -NewName {
$firstLine = ($_ | Get-Content -TotalCount 1) -replace '\W'
'{0}.txt' -f $firstLine
}
Or to remove any character that is not in the character ranges a-z
, A-Z
, 0-9
or a space
:
Get-ChildItem *.txt | Rename-Item -NewName {
$firstLine = ($_ | Get-Content -TotalCount 1) -replace '[^a-z0-9 ]'
'{0}.txt' -f $firstLine
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论