none
Получение части имени файла в переменую RRS feed

  • Вопрос

  • Извенте за глупый вопрос. Но мне нужно имя архива разбить на три части и передать в переменную.

    Есть архив с названием part1#part2#00_filename.zip Мне нужно присвоить переменой $a = part1 $b = part1 $c = filename. Тоже самое нужно сделать с папкой part1#part2#00_filename если распакованый архив. при условии что все части могут быть разной длины

    вот что нашел

    $a = $file.name.tostring().substring(0,$file.name.indexof("#"))

    $b = ?

    $c = ?

    Знающие, подскажие.

Ответы

Все ответы

  • Ну к примеру можно вот так :)

    $i = 1

    'part1#part2#00_filename.zip' -split '#' | ForEach-Object {Set-Variable -name ("Pr"+$i) -value $_ ;$i++}


    Получатся переменные

    Pr1 = part1

    Pr2 = part2

    Pr3 = 00_filename.zip



    • Изменено Deft_ 14 мая 2012 г. 3:46
  • Это хорошо, а как тогда получить в 3 переменной filename?
  • 'part1#part2#00_filename.zip' -match "(?<one>.+)#(?<two>.+)#.+_(?<file>.+)(\..+)"

    PS C:\Users\User> $matches
    
    Name                           Value
    ----                           -----
    file                           filename
    two                            part2
    one                            part1
    1                              .zip
    0                              part1#part2#00_filename.zip
    
    PS C:\Users\User> $matches.one
    part1
    PS C:\Users\User> $matches.two
    part2
    PS C:\Users\User> $matches.file
    filename

    Отвечающий
  • Не знал, что в $matches можно задавать имена, спасибо. :)

    З.Ы. в качестве допила моего варианта можно написать так $Pr3 = $Pr3 -replace '^(...)(.{2,})(....)$', '$2'

    Хотя вариант Kazun (с), конечно, удобнее.

    З.Ы.Ы. про регулярные выражения можно почитать, к примеру, тут http://xaegr.wordpress.com/2009/11/20/regexp-1-intro/


    • Изменено Deft_ 14 мая 2012 г. 8:22
  • Большое спс за помощь. А можно еще вопрос. А как такое же сделать для папки? Или я неправилно может неправельно делаю выбор папки?

    $file = get-item *
    $file -match "(?<one>.+)#(?<two>.+)#.+_(?<file>.+)(\..+)"
    $matches

    получаю

    Mode                LastWriteTime     Length Name                                       
    ----                -------------     ------ ----                                       
    -a---        27.04.2012     12:43      45168 part1#part2#00_filename.zip                  
    
    Key   : file
    Value : filename
    Name  : file
    
    
    Key   : two
    Value : part2
    Name  : two
    
    
    Key   : one
    Value : D:\Temp\Se\part1
    Name  : one
    
    
    Key   : 1
    Value : .zip
    Name  : 1
    
    
    Key   : 0
    Value : D:\Temp\Se\part1#part2#00_filename.zip 
    Name  : 0
    несмотря на то что там есть папки с такими именами


    • Изменено SkyAn 14 мая 2012 г. 9:10
  • Я бы с удовольствием разобрался в этом, но просто нет времени. Нужно выполнить задачу, а потом уже
  • $filesname = Get-ChildItem | Where {$_.Name -match "(?<one>.+)#(?<two>.+)#.+_(?<file>.+)(\..+)"} | Foreach {New-Object PsObject -Property @{One=$matches.one;Two=$matches.Two;File=$matches.File}}

    Отвечающий
  • $filesname = Get-ChildItem | Where {$_.Name -match "(?<one>.+)#(?<two>.+)#.+_(?<file>.+)(\..+)"} | Foreach {New-Object PsObject -Property @{One=$matches.one;Two=$matches.Two;File=$matches.File}}

    Извени, наверно я еще не очень силен в написании скриптов и в PowerShell. Если можешь, посмотри тему и подскажи где ошибки.