none
Posh unicode? RRS feed

  • Вопрос

  • Столкнулся с препятствием: скачал из локалки музон. После распаковки и при переносе файлов в нужную мне директорию, _не юникодный_ фар отказался работать с одним из mp3. Зная проблему старого фара решил данный файл переименовать через юникодный Posh, но меня ждала та же ошибка: "объект не существует". В названии файла был один "неверный" символ апострофа "Itʾs" против верного "It's". В проводнике все отлично переименовывается и файл свободно копируется, а в Far и Posh нет. Но самым большим изумлением было, когда через cmd.exe я проделал все это без проблем... Вы можете высказать свое мнение по данной ситуации?
    21 июня 2009 г. 14:15

Ответы

  • В общем разобрался с проблемой. В названиях многих папок в пути к mp3-файлам были квадратные скобки. Батником переименовал и все стало на свои места. Всем спасибо. Наверное надо было использовать -literalpath.
    • Помечено в качестве ответа 01MDM 22 июня 2009 г. 9:37
    22 июня 2009 г. 9:37

Все ответы

  • А как Вы в Posh'е переименовать пробовали?..

    PowerShell "насквозь" unicode поддерживает. У меня Rename-Item файлы с unicode-именами переименовывает...

    Может, Вы имя файла без кавычек передавали? Попробуйте так:

    rename-item "filename" "filename"


    Спасибо моей жене Кате, Клевогину С.П., Козлову С.В., Муравлянникову Н.А., Никитину И.Г., Шапиро Л.В. за мои знания! :)
    21 июня 2009 г. 14:32
    Отвечающий
  • Да, и вот еще что. Если у Вас символы в консоли не отображаются, то это проблема оболочки, а не posh. Советую сменить родную оболочку Windows Powershell на PowerGUI.


    Спасибо моей жене Кате, Клевогину С.П., Козлову С.В., Муравлянникову Н.А., Никитину И.Г., Шапиро Л.В. за мои знания! :)
    21 июня 2009 г. 14:43
    Отвечающий
  • Символы все были видны, хоть и использую стандартный хост. Конечно название файла заключал в кавычки - в нем были пробелы. Я вообще не сразу въехал в ситуацию, т.к различия в символах этого апострофа на первый взгляд и не разглядишь, в проводнике переименовывал, но по другому критерию. Только потом понял что не так.. Кстати rename-item не хотел по <TAB> дополнять имя файла. 
    21 июня 2009 г. 14:56
  • В PowerShell обратный апостроф используется как маскирующий (escape) символ, а одинарная кавычка как ограничитель строки. Так что в случае если они есть в имени, всё становится немножко сложнее, но не сильно. Надо лишь замаскировать их:

    PS C:\temp> ls -Name
    It's.txt
    Itʾs.txt
    It`s.txt
    #Одиночная кавычка, маскируем обратным апострофом
    PS C:\temp> ren .\It`'s.txt its1.txt -Verbose
    VERBOSE: Performing operation "Rename File" on Target "Item: C:\temp\It's.txt Destination: C:\temp\its1.txt".
    #Unicode кавычка (копипаст из поста автора), даже маскировать не пришлось.
    PS C:\temp> ren .\Itʾs.txt its2.txt -Verbose
    VERBOSE: Performing operation "Rename File" on Target "Item: C:\temp\Itʾs.txt Destination: C:\temp\its2.txt".
    #Обратный апостроф, маскируем вторым таким же.
    PS C:\temp> ren .\It``s.txt its3.txt -Verbose
    VERBOSE: Performing operation "Rename File" on Target "Item: C:\temp\It`s.txt Destination: C:\temp\its3.txt".

    Вообще я это тестировал на 2.0, на 1.0 что то может отличаться, постараюсь проверить сегодня.


    ЗЫ: Юникодные символы прекрасно отображаются в обычном текстовом хосте, достаточно установить юникодный шрифт (Lucida Console, Consolas)
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    22 июня 2009 г. 3:48
    Модератор
  • > ЗЫ: Юникодные символы прекрасно отображаются в обычном текстовом хосте, достаточно установить юникодный шрифт (Lucida Console, Consolas)

    У меня Consolas (из 7-ки - содержит элементы псевдографики - для Far'а актуально). Какой точно знак был я не знаю, в charmap.exe нашел несколько похожих, но знак был точно не "`" обратный апостроф, поэтому его экранировать и не надо. Просто Posh 1.0 не видел этот файл при попытке переименовать, а get-childitem его выводил.

    PS. Неожиданно возник вопрос. Как вывести только *.mp3 из текущего каталога? Пробовал:

    get-childitem *.mp3
    get-childitem * -include *.mp3
    get-childitem .\*.mp3

    Ни один не работает..

    22 июня 2009 г. 5:49
  • > У меня Consolas (из 7-ки - содержит элементы псевдографики - для Far'а актуально).
    Ого, не знал :) Наконец то поставлю себе в фаре консолас :)

    >Какой точно знак был я не знаю, в charmap.exe нашел несколько похожих, но знак был точно не "`" обратный апостроф, поэтому его экранировать и не надо. Просто Posh 1.0 не видел этот файл при попытке переименовать, а get-childitem его выводил.

    Ну если его выводил Get-Childitem, то можно просто перенаправить вывод в виде объекта из одного в другой:

    Get-ChildItem new* | Rename-Item -NewName "MyFile.txt" -Verbose

    Можно еще добавить каких либо фильтров для отбора конкретного файла.

    >PS. Неожиданно возник вопрос. Как вывести только *.mp3 из текущего каталога? Пробовал:
    >Get-ChildItem *.mp3
    >Get-ChildItem * -Include *.mp3

    Всё работает... А там точно mp3? :)

    [PS <16> C:\temp] Get-ChildItem *.mp3 Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 22.06.2009 10:05 14 test1.mp3 -a--- 22.06.2009 10:05 14 test2.mp3 -a--- 22.06.2009 10:05 14 test3.mp3 [PS <17> C:\temp] Get-ChildItem * -Include *.mp3 Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 22.06.2009 10:05 14 test1.mp3 -a--- 22.06.2009 10:05 14 test2.mp3 -a--- 22.06.2009 10:05 14 test3.mp3 [PS <18> C:\temp] Get-ChildItem .\*.mp3 Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 22.06.2009 10:05 14 test1.mp3 -a--- 22.06.2009 10:05 14 test2.mp3 -a--- 22.06.2009 10:05 14 test3.mp3 [PS <19> C:\temp] Get-ChildItem -Filter *.mp3 Каталог: C:\temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 22.06.2009 10:05 14 test1.mp3 -a--- 22.06.2009 10:05 14 test2.mp3 -a--- 22.06.2009 10:05 14 test3.mp3



    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    22 июня 2009 г. 6:13
    Модератор
  • > Всё работает... А там точно mp3? :)

    Что-то я начал сомневаться, ввел `dir /b /s \Music\*.mp3`, все отработало правильно...
    На всякий случай переименовал все 2,5 Гектара:

    @echo off
    setlocal
    for /f "tokens=*" %%i in ('dir /b /s z:\MUSIC\*.mp3') do call:ren "%%i"
    goto:eof
    
    :ren
    ren %1 "%~n1.mp3"


    Так работает : get-childitem -filter *.mp3
    А так нет:        get-childitem *.mp3

    А другие расширения нормально отрабатываются. Ничего не понимаю.
    22 июня 2009 г. 7:45
  • Сейчас проверю в 1.0. Может там была какая то "изюминка" с цифрами в расширениях? :)
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    22 июня 2009 г. 7:47
    Модератор
  • XP SP3, PS 1.0
    Все варианты отрабатывают правильно...


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    22 июня 2009 г. 7:53
    Модератор
  • Спасибо за помощь, по всей видимости это проблема не PS, а что-то с разделом диска. На нем powershell не отрабатывает ни на одном paсширении файла, а на других разделах все в порядке, включая mp3-файлы.

    Правда это касается только PS.. Так что не понятно.
    22 июня 2009 г. 8:11
  • В общем разобрался с проблемой. В названиях многих папок в пути к mp3-файлам были квадратные скобки. Батником переименовал и все стало на свои места. Всем спасибо. Наверное надо было использовать -literalpath.
    • Помечено в качестве ответа 01MDM 22 июня 2009 г. 9:37
    22 июня 2009 г. 9:37