Powershell Удаление начального нуля из имени файла - PullRequest
0 голосов
/ 07 мая 2018

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

XXX_01_07_11_1.bat
XX_1_07_06_02.bat
XXXX_2_22_14_01_02.bat

Без определенной длины.

Я хотел бы переименовать все файлы в папке, удалив все начальные нули. например, XXX_01_07_11_1.bat будет переименован в XXX_1_7_11_1.bat.

Я нашел несколько способов сделать это в Bash, но не с PowerShell.

Ответы [ 5 ]

0 голосов
/ 08 мая 2018

Примените _0+(?=[1-9]) или _0+(?=\d) регулярное выражение следующим образом:

Get-ChildItem . -File -Filter "*_0*.*" |
    ForEach-Object {
        Rename-Item $_.FullName $($_.Name -replace '_0+(?=\d)', '_') -WhatIf
    }

Удалите параметр снижения риска -WhatIf сразу после отладки (или используйте -WhatIf:$false для подавления автоматического поведения WhatIf , которое возникает, когда значение переменной $WhatIfPreference равно 1, см. также Get-Help about_Preference_Variables).

Regex объяснение:

  • _ соответствует символу _ Нижняя строка (подчеркивание) буквально
  • 0+ соответствует буквально 0 буквально
    • + Квантификатор - сопоставляет от одного до неограниченного числа раз, столько раз, сколько возможно, возвращая при необходимости ( жадный )
  • ?= Позитивный взгляд. Утверждают, что после совпадения _0+ следует
    • [1-9] один символ в списке [1-9], то есть в диапазоне от 1 (Unicode 49) до 9 (Unicode 57), или
    • \d цифра (равно [0-9] список , но [1-9] эффективно из-за жадности ´0 + ´ выше ).
0 голосов
/ 07 мая 2018

Примечание. По сути, это похоже на принятый ответ , но демонстрирует, что вы можете передать Get-ChildItem вывод напрямую в Rename-Item, что является более лаконичнее и эффективнее.

Get-ChildItem . -Filter *.bat |
  Rename-Item -NewName { $_.Name -replace '(?<=_)0+' } -WhatIf

Укажите нужную целевую папку вместо .
-WhatIf превью переименование; удалите его, чтобы фактически переименовать.

  • Вы можете передать блок сценария ({ ... }) в Rename-Item -NewName, который оценивается для каждого входного объекта (файла) и в котором $_ ссылается на файл в рука.

    • Обратите внимание, что это работает, даже если -NewName является типом [string]. Возможность передавать вместо этого блок скрипта - параметр блока скрипта - мощная универсальная функция PowerShell, которая позволяет вычислять значение параметра для для каждого объекта ввода основа через блок скрипта - подробности см. здесь .
  • -replace выполняет замену строки на основе регулярных выражений, а '(?<=_)0+' заменяет любую последовательность из одного или нескольких (+) 0 символов, если перед ними стоит (?<=) _ char .

    • (?<=_) является экземпляром (положительного) утверждения за кадром , что означает, что хотя _ равно соответствует , оно не будет захвачено ; то есть оно не становится частью того, что заменяется .
    • Поскольку строка замены не указана, нули эффективно удаляются .
0 голосов
/ 07 мая 2018


Самый простой способ - заменить _0 на _, например:

Get-ChildItem _my_Path | ForEach-Object {
    $f_name = $_.FullName
    $name = $_.Name
    $new_name = $name -replace "_0","_"
    Rename-Item $f_name -NewName $new_name
}

Пожалуйста, попробуйте. :)

0 голосов
/ 07 мая 2018
cd c:\temp

'X_01_00007_11_1.bat','X_1_07_06_02.bat','X_2_22_14_01_02.bat','X_000_0_07_06_02.bat'|% {
New-Item $_ -Force}

Get-ChildItem -Path C:\Temp -File |ForEach-Object {
    $oldname=$_.Name
    $newname = $oldname -replace '_0+(?=\d)', '_'
    #or
    #$newname = $oldname -replace '_0+(\d)', '_$1'
    Rename-Item $oldname -NewName $newname 
}

目录: C: \ temp

Режим LastWriteTime Длина Имя
---- ------------- ------ ----
-a ---- 2018/5/7 20:55 0 X_01_00007_11_1.bat
-a ---- 2018/5/7 20:55 0 X_1_07_06_02.bat
-a ---- 2018/5/7 20:55 0 X_2_22_14_01_02.bat
-a ---- 2018/5/7 20:55 0 X_000_0_07_06_02.bat

PS C: \ temp> dir

目录: C: \ temp

Режим LastWriteTime Длина Имя
---- ------------- ------ ----
-a ---- 2018/5/7 20:55 0 X_0_0_7_6_2.bat
-a ---- 2018/5/7 20:55 0 X_1_7_11_1.bat
-a ---- 2018/5/7 20:55 0 X_1_7_6_2.bat
-a ---- 2018/5/7 20:55 0 X_2_22_14_1_2.bat

0 голосов
/ 07 мая 2018

попробуйте это:

get-childitem "c:\temp" -file -filter "*.bat" | %{

$NewName=($_.Name -split '_' | %{if ($_ -eq '0') {'0'} else {$_.TrimStart('0')}}) -join '_'
Rename-Item $_.FullName $NewName

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...