我正在尝试编写一个小的PowerShell脚本来清除某些日志转储中的文件名,但我似乎被卡住了...我从各种来源转储了日志,文件名似乎变得混乱了。
我正在寻找名称这样的文件的名称......“Source - Service.log”
Get-ChildItem *.* -Path ~/Desktop/New | ForEach-Object {
while ([string]($_.Name) -notmatch "^[a-z].*" -or [string]($_.Name) -notmatch "^[A-Z].*") {
Rename-Item -NewName { [string]($_.Name).Substring(1) }
}
Write-Host $_.Name
}
输出似乎错了。
Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input. At line:8 char:30 + Rename-Item -NewName { $File.Substring(1) } + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.RenameItemCommand
想法是检查文件名以查看它是否是一个字符,如果没有删除它,删除“。 - /和whitespace”
我正在运行的原始文件是这样的:
1. source - data (1).log
100. - source - Data.log
(1) Source - data.log
source - data.log
<space><space> source - data.log
我从上面寻找的结果是:我不关心重复的文件名作为源和数据日常变化,文件夹定期清除...
source - data (1).log source - Data.log Source - data.log source - data.log source - data.log
有人能告诉我如何通过这个错误?
如果您的目标是删除前导非字母字符,则可以简化您正在执行的操作:
$files = Get-ChildItem -Path ~\Desktop\New -File
foreach ($file in $files)
{
if ($file.BaseName -notmatch '\S+\s-')
{
$newName = $file.Name -replace '^.+?(?=[a-z])'
$newName = Join-Path $file.DirectoryName $newName
if (Test-Path -Path $newName)
{
Remove-Item -Path $newName
}
$file | Rename-Item -NewName $newName
Write-Verbose $newName
}
}
这将迭代您的列表并查找您的模式,并在必要时重命名。假设:source
没有空格。
$pattern = '[^a-zA-Z]'
Set-Location <YourDir>
Get-Childitem | Foreach-Object {
Rename-Item -Path ".\$($_.Name)" -NewName "$($_.BaseName -replace $pattern,'')$($_.extension)"
}