Как передать переменные во вложенные циклы в PowerShell? - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь написать небольшой скрипт 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

Идея состоит в том, чтобы проверить имя файла, чтобы увидеть, является ли он символом, и, если не удалить его, удалить ". - / и пробел"

Оригинальные файлы, с которыми я работаю, выглядят так:

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

Может кто-нибудь сказать мне, как обойти эту ошибку?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Если ваша цель состоит в том, чтобы удалить ведущие не-буквенные символы, вы можете упростить то, что вы делаете:

$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 не имеет пробелов.

0 голосов
/ 02 сентября 2018
  1. Это может быть полезно: Remove-NonAlphanumericCharFromString .
  2. Зная, как удалить не алфавитно-цифровую, возьмите базовое имя файла (имя без пути и расширения).
  3. Заменить ненужные символы пустой строкой.

    $pattern = '[^a-zA-Z]'
    Set-Location <YourDir>
    Get-Childitem | Foreach-Object {
        Rename-Item -Path ".\$($_.Name)" -NewName "$($_.BaseName -replace $pattern,'')$($_.extension)"
    }
    
  4. Обратите внимание, что приведенное выше не удастся при необходимости перезаписать существующий файл.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...