2016-10-28 5 views
1

ПроблемаПереименование одного файла (и ничего более одного файла) с помощью PowerShell

Я постоянно нахожусь в потребности быстрого способа переименования случайный файл здесь и там, пока я работаю. Мне нужно привести эти имена файлов в структуру, совместимую с веб-стандартами и некоторыми личными потребностями. Несколько примеров ниже:

 
When I find       I need 
---------------------------------- ----------------------------------------- 
Welcome to the party.JPG   welcome_to_the_party.jpg 
Instructions (and some other tips) instructions_and_some_other_tips 
Bar Drinks – The Best Recipes  bar_drinks_the_best_recipes 
La mañana del águila y el ratón  la_manana_del_aguila_y_el_raton 

В основном нужно:

  • все символы верхнего регистра, чтобы стать строчными
  • пространства, чтобы стать подчеркнуть
  • некоторые другие специальные символы и диакритические для других языков, чтобы стать их ближайший совпадение (á is a, é is e, ç is c и т. д.)
  • Символы like() [] {} '; , чтобы полностью исчезнуть
  • Возможно, некоторые замены (необязательно): # = нет; @ = При или & = и

Не вопрос, а просто FYI, и вы можете увидеть большую картину

Я буду использовать запись реестра [HKEY_CLASSES_ROOT * \ оболочка ...] так Я могу вызвать командный файл и/или сценарий PowerShell, щелкнув правой кнопкой мыши нужный файл, передав информацию о аргументе (файл, о котором идет речь) в сценарий таким образом.

Мои догадывается

Я смотрел внимательно на скриптах PowerShell, но я не очень хорошо осведомлен об этой области еще и все решения при условии, до сих пор обращаются вся папка (Dir/Get- ChildItem) вместо определенного файла.

Например, мне удалось использовать строку ниже (PowerShell), чтобы заменить все пробелы символом подчеркивания, но затем она влияет и на другие файлы в каталоге.

Dir | Rename-Item –NewName { $_.name –replace “ “,”_“ } 

Опять же, мне не нужно, чтобы решить эту проблему для всей папки, так как у меня уже есть способы сделать это с помощью программного обеспечения, как Total Commander.

Спасибо за любую помощь, которую вы можете мне дать.

Рюи

+1

С помощью пакетного файла вы бы просто использовать несколько операторов набор для замены одного символа другим. Это базовая замена строки. Таким образом, чтобы заменить пространство символом подчеркивания: 'set var =% var: = _%' – Squashman

+1

У нас также есть функция пакетного файла на Dostips.com для преобразования в нижний регистр. http://www.dostips.com/DtCodeCmdLib.php#Function.toLower – Squashman

+1

Почему вы используете смарт-цитаты? Это не сработает ... – DavidPostill

ответ

0

Поместите этот сценарий где-то (назовем его WebRename.ps1):

$old = $args -join ' ' 
$new = $old.ToLower().Replace(' ', '_') 
# add all the remaining transformations you need here 
Rename-Item $old $new 

В реестре использовать это в качестве команды (со своим собственным путем, конечно):

PowerShell -c C:\WebRename.ps1 "%1" 
0

Если вы хотите сделать это быстро и всегда хотите, чтобы те же самые изменения были сделаны, вы можете добавить следующую функцию в.psm1, а затем поместите файл в одну из папок вашего модуля (C: \ Program Files \ WindowsPowerShell \ Modules - самый распространенный), вы сможете просто вызвать файл WebRename-File filePath в любое время, когда вам нужно быстро переименовать файл, функция настраивается таким образом, чтобы работать нормально, если вы передаете один путь к файлу или можете передать результаты get-childitem, если вы когда-либо найдете необходимость выполнять массовые переименования.

function WebRename-File { 
    param(
    [parameter(Mandatory=$true,ValueFromPipeline=$true)] 
     $filePath 
    ) 

    begin{} 
    Process{ 
     foreach($path in $filePath){ 
      $newPath = $path.ToLower() 
      $newPath = $newPath.Replace(' ','_') 

      ###add other operations here### 

      Rename-Item -Path $path -NewName $newPath 
     } 
    } 
    end{} 
} 
+0

Мне не повезло. Я пробовал код непосредственно из .ps1, а также модуль .psm1, и файлы не меняются. :(Я благодарю вас за ваше время, и ваш код является самым элегантным! – ruyelpequenocid

1

может быть этот код может помочь вам

function Remove-Diacritics([string]$String) 
    { 
     $objD = $String.Normalize([Text.NormalizationForm]::FormD) 
     $sb = New-Object Text.StringBuilder 

     for ($i = 0; $i -lt $objD.Length; $i++) { 
      $c = [Globalization.CharUnicodeInfo]::GetUnicodeCategory($objD[$i]) 
      if($c -ne [Globalization.UnicodeCategory]::NonSpacingMark) { 
       [void]$sb.Append($objD[$i]) 
      } 
      } 

     return("$sb".Normalize([Text.NormalizationForm]::FormC)) 
    } 

    function Clean-String([string]$String) 
    { 
     return(Remove-Diacritics ($String.ToLower() -replace "#", "no" -replace "\@", "at" -replace "&", "and" -replace "\(|\)|\[|\]|\{|\}|'|;|\,", "" -replace " ", "_")) 
    } 


    $youfile="C:\tmp4\121948_DRILLG.tif" 
    $younewnamefile=Clean-String $youfile 
    Rename-Item -Path $youfile $younewnamefile 
Смежные вопросы