Thursday, September 10th, 2009

Русские буквы

Проблема возникла с Vim'ом. Если запускать его из cmd.exe, то русские буквы отображаются кракозябрами, если из Powershell, то часть букв не печтатается. Пытался играть с настройками вима, но оказалось, что дело в настройках виндовой консоли. Если отказаться от Raster Fonts для консоли, то все отображается нормально. Но отказываться приходится в пользу Lucida Console, а мне он что-то не слишком нравится.
Сущестсвует способ добавления фонтов в консоль:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
Имеется
0 : Lucida Console
Добавляем еще каких-нибудь фонтов следующим образом
00 : Courier New
000 : Consolas
И т.д.: добавляешь ноль и прописываешь фонт.Мне понравился Consolas
(Leave a comment)

Sunday, August 2nd, 2009

PowerShell: поиск/замена в файлах

# Найти какую-то строчку в текстовом файле без запуска редактора. 
# Пример, поиск номеров телефонов по маске:
type d:\my\phonebook.csv | ? {$_ -like '*pizza*'}

# Поиск можно организовать и по папкам
'*.h', '*.cpp' | % { ls d:\projects $_ -rec} | % {type $_.FullName} | ? {$_ -like '*RegOpenKeyEx*'}
#просто балдею от пайплайнов :)

# Пакетная замена в файлах. Cохранить исходные файлы, скопировав их в <filename>.bak
# http://blog.commandlinekungfu.com/2009/05/not-ready-yet-episode-replacing-strings.html
# cp - Copy-Item; gc, type - Get-Content; sc - Set-Content
$a = (gci | ? {$_.Attributes -ne "Directory"}); $a | % { cp $_ "$($_).bak";
(gc $_) -replace "foo","bar" | sc -path $_ }
(Leave a comment)

Monday, July 27th, 2009

Список подкастов через PowerShell

Хочется послушать последние подкасты, которые пришли
#сохранить список последних подкастов из нужных фидов в файл
$podcasts = ls 'D:\Podcasts\Directions Media', 'D:\Podcasts\Planetary Radio', `
    'D:\Podcasts\Very Spatial Podcast' *.mp3 | sort lastwritetime | select -last 6 | % {$_.FullName}
#имя m3u файла
$m3u_path = $env:userprofile + '\lastpodcasts.m3u'
#вывести в файл
$podcasts > $m3u_path
#запустить плеер с полученным m3u
& ($env:ALLUSERSPROFILE + '\Start Menu\Programs\K-Lite Codec Pack\Media Player Classic.lnk') $m3u_path
(Leave a comment)

Wednesday, July 1st, 2009

Куча мелочи для PowerShell


  • ps-провайдеры
    ls env: | fl #Отобразить все переменные окружения
    $env:path    #Обращение к итему через символ $
                 #Отобразить содержимое переменной PATH
    #Добавить путь в переменную PATH (к сожалению с реестром так нельзя)
    $envvar = $env:path + ';C:\Python25\'
    $env:path = $envvar
    #Можно проще (именно ", а не ')
    $env:path = "$env:path;C:\Python25\"


  • Write-Host вывод текста (foregroundcolor - цвет текста, backgroundcolor - цвет фона)
    Write-Host "Hello world" -foregroundcolor red
  • New-PSdrive - новый драйв (алиас: mount)
    New-PSdrive -name scripts -PSprovider filesystem -root C:\bin\PowerShellScripts
    теперь можно будет писать script:
    и самое главное!
    для реестра есть драйвы: HKLM и HKCU, но нет HKCR.
    New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

  • Еще одна фишь по последней ссылке: провайдер Registry не поддерживает опцию filter. Но можно смошенничать. И добиться схожего через pipeline
    сd HKLM:\SOFTWARE\
    dir | ?{$_.Name -like '*Int*'}

  • Еще проблема: запустить обычный ls для для сетевого ресурса при location в реестре
    PS HKCR:\.kml\Google Earth.kmlfile> ls \\yoda\incoming
    Get-ChildItem : Cannot process argument because the value of argument "path" is invalid. Change the value of the "path"
    argument and run the operation again.
    At line:1 char:3
    + ls <<<< \\office\temp
    + CategoryInfo : InvalidArgument: (:) [Get-ChildItem], PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.GetChildItemCommand

    нужно явно указать провайдера:
    PS HKCR:\.kml\Google Earth.kmlfile> ls filesystem::\\yoda\incoming



  • Read-Host - считать строку
    $a = Read-Host "Enter your name"
    Write-Host "Hello" $a


И много всего полезного здесь

а здесь чудо: демо для работы с WinForms
(Leave a comment)

Friday, June 26th, 2009

PowerTab

Это такой Intellisense для Powershell. Делает его натурально Marc van Orsouw (текущая версия: 0.99b2).
  • Скачиваем, распаковываем
  • Подписываем PowerTabSetup.ps1 и запускаем его
  • Оно сразу скажет, какие ей нужно еще скрипты подписать: выйти, подписать. (Правда подозреваю, что можно просто
    sign-file.ps1 C:\InstalPath\*.ps1

    но сам не хочу так делать, чтоб удовольствие растянуть

  • Name
    ----
    add-tabExpansion
    add-TabExpansionComputersNetView
    add-TabExpansionComputersOU
    add-tabExpansionEnum
    Add-TabExpansionEnumFromLastError
    add-TabExpansionTypes
    Export-tabExpansionConfig
    Export-tabExpansionDataBase
    Export-TabExpansiontheme
    get-tabExpansion
    get-TabExpansionComputer
    get-TabExpansionCustom
    Import-tabExpansionConfig
    Import-TabExpansionDataBase
    Import-TabExpansiontheme
    Invoke-TabExpansionEditor
    New-tabExpansionDataBase
    Remove-tabExpansion
    Update-TabExpansion
    Update-TabExpansionTypes
    Update-TabExpansionWmi

  • 24.73 КБ
(Leave a comment)

Thursday, June 25th, 2009

SSH client

Для того, чтобы заливать на alwaysdata.net предполагаемое содержимое будущего сайта. Можно, конечно, взять PuTTY и не париться. Но зачем еще одна консоль, когда есть такой замечательный PowerShell? Нужно только правильно подобрать антидепрессанты cmdlets/аппликушки. Имеются такие варианты:
  • plink.exe из PuTTY (TODO: говорят - его хорошо потреблять с питоном): основная версия, портабельная
  • NetCmdlets - содержит более 30 cmdlets для протоколов SNMP, LDAP, DNS, Syslog, HTTP, WebDav, FTP, SMTP, POP, IMAP, Rexec/RShell, Telnet и т.д. Очень мощная штука, к тому же платная, хотя есть халявная hobbyist license. Но только зачем такая мощь, когда нужен только SSH. К тому же получать эту лицензию скучно.
  • А вот человек написал (+1) способ через некую открытую либу SharpSSH (download) его и попробую.
(Leave a comment)

Monday, June 1st, 2009

PowerShell (ламерство)

Перечисление имен зарегистрированных PS-провайдеров
Get-PSProvider | select Name

Перечисление PS-драйвов, с упорядочением сначала по провайдеру, потом по имени
Get-PSDrive | sort Provider, Name
(Leave a comment)

Monday, March 2nd, 2009

Переезд на новый TFS-сервер

Проблема в том, что не даёт прописать те же пути на новый сервер, на тот же проект. Все мутно. В общем нужно, чтобы система забыла ссылку на старый сервер. Для этого используется скрипт Джеймса Мэннинга get-workspace.ps1

PS E:\TradeFed> $ws = D:\my\Programming\Scripts\PowerShell\tfs\get-workspace.ps1 e:\
PS E:\TradeFed> $ws.Name
NABOO
PS E:\TradeFed> $ws.OwnerName
TRADEFED\kenobi
PS E:\TradeFed> $ws.VersionControlServer


TeamFoundationServer : http://old_server:8080/
AuthenticatedUser    : TRADEFED\kenobi
CurrentCommand       :
ServerGuid           : 3123a59f-963f-43bb-8111-8f387ea50765
Canceled             : False
ArtifactProvider     : Microsoft.TeamFoundation.VersionControl.Client.VersionControlArtifactProvider

PS E:\TradeFed> $ws.VersionControlServer.DeleteWorkspace('NABOO','TRADEFED\kenobi')
True

(Leave a comment)

Monday, January 26th, 2009

Powershell: сервисы

  • перечислить все сервисы, которые содержат в имени sql
    PS D:\> get-service *sql*
    
    Status   Name               DisplayName
    ------   ----               -----------
    Stopped  MSSQL$SQLEXPRESS   SQL Server (SQLEXPRESS)
    Stopped  MSSQLServerADHe... SQL Server Active Directory Helper
    Stopped  SQLBrowser         SQL Server Browser
    Stopped  SQLWriter          SQL Server VSS Writer
    

  • стартовать все сервисы, которые содержат в имени sql
    PS D:\my\My Received Podcasts> start-service *sql*

  • остановить все сервисы, которые содержат в имени sql
    PS D:\my\My Received Podcasts> stop-service *sql*

(Leave a comment)

Tuesday, July 15th, 2008

Powershell: копирование, упорядочивание

нашли все кмл-файлы и вывели их в порядке возрастания даты последней записи
PS> ls d:\ *.kml -recurse | sort LastWriteTime

то же самое, в убывающем порядке
PS> ls d:\ *.kml -recurse | sort LastWriteTime - descending

последний скачанный файл в папке с подкастами
PS> (ls 'D:\my\My Received Podcasts\Svobodanewsru' | sort LastWriteTime -descending)[0]

скопировать последний скачанный файл из папки подкастов на флешь
PS> cpi -path 'D:\my\My Received Podcasts\Svobodanewsru\*' -filter (ls 'D:\my\My Received 
Podcasts\Svobodanewsru' | sort LastWriteTime -des)[0] -destination f:

то же самое в случае, когда мы уже находимся в нужной папке
PS D:\my\My Received Podcasts\Business News (Russian)> cpi (ls | sort LastWriteTime -des)[0] f:

а теперь скопировать 4 последних скачанных (файла в данной папке) на флешь
PS D:\my\My Received Podcasts\Svobodanewsru> cpi (ls | sort lastwritetime -des | select -first 4) f:

а теперь то же самое, но 4 файла брать с проверкой также вложенных папок
PS D:\My\My Received Podcasts> ls . -Recurse -Filter *.mp3 | sort lastwritetime | select -last 4 | cpi -Destination g:
(Leave a comment)

Monday, July 7th, 2008

Пакетные переименования файлов в powershell

добавил 0 перед именем файла; WhatIf для соображения тестирования: показывает предположительные данные, если получается то, чего ждешь, то убираем его
PS> Get-ChildItem [0-9][0-9]_*.mp3 | Foreach { Rename-Item $_ -NewName @('0'+$_.name)[0] -WhatIf }

заменить пробелы на подчерки
gci *.mp3 | % { rename-item $_ $_.Name.Replace(" ", "_")}

foreach можно заменять на %
get-childitem, gci, ls, dir - это одно и то же
(2 comments | Leave a comment)

Friday, April 25th, 2008

Попытка поженить Team Foundation и PowerShell


  1. Скачиваем PS. С сайта М$ просят какой-то валидации, которая моя корпоративная винда не прошла. линк, отсюда.
  2. Скачали, установили. Попытались запустить скрипт - хрен. Режим Restricted. (команда Get-ExecutionPolicy). Устанавливаем, чтобы запускались все подписанные скрипты (Set-ExecutionPolicy AllSigned). См. http://www.hanselman.com/blog/SigningPowerShellScripts.aspx
  3. Сделали подписочный скрипт из хелпа (PS D:\> get-help about_signing).
    sign-file.ps1
    param([string] $file=$(throw "Please specify a filename."))
    $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
    Set-AuthenticodeSignature $file $cert
    

  4. Создали сертификат authority
    PS C:\Program Files\Microsoft Office\Office10> .\MAKECERT.EXE -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3
    .6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine
    Succeeded
    

  5. Создали персональный сертификат на полученном выше сертификат-authority
    PS C:\Programs\MSVS8\SDK\v2.0\Bin> .\makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root
    .pvk -ic root.cer
    Succeeded
    

  6. Проверяем сертификат:
    PS C:\Programs\MSVS8\SDK\v2.0\Bin> gci cert:\CurrentUser\My -codesign
    
    
        Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
    
    
    Thumbprint                                Subject
    ----------                                -------
    B3CA56DEFD8FD4770E151F5D67AD3E708FEB9F86  CN=PowerShell User
    

  7. Подписываем подписывающий скрипт:
    PS C:\Program Files\Microsoft Office\Office10> $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
    PS C:\Program Files\Microsoft Office\Office10> Set-AuthenticodeSignature D:\My\Programming\Scripts\PowerShell\sign-file.ps1 $cert
    
    
        Directory: D:\My\Programming\Scripts\PowerShell
    
    
    SignerCertificate                         Status                                 Path
    -----------------                         ------                                 ----
    2FF541ED28EF11CB726BE3167DEC69EA479DBF2A  Valid                                  sign-file.ps1
    

  8. Запускаем подписанный подписывающий скрипт
    PS D:\my\Programming\Scripts\PowerShell> .\sign-file.ps1
    
    Do you want to run software from this untrusted publisher?
    File D:\my\Programming\Scripts\PowerShell\sign-file.ps1 is published by CN=PowerShell User and is not trusted on your
    system. Only run scripts from trusted publishers.
    [V] Never run  [D] Do not run  [R] Run once  [A] Always run  [?] Help (default is "D"): a


    {{==========> Была ошибка <===========================================
  9. Находим файл с созданным сертификатом (C:\Program Files\Microsoft Office\Office10\root.cer) и инсталируем его согласно ссылки
  10. Не помогло. Не слишком интересная возня в 3 часа и все-таки подписал подписывающий скрипт.
    }}==========> Была ошибка <===========================================

  11. Подписал скрипт Джеймса Мэннинга (James Manning) этим подписывающим скриптом. Собственно, с Мэннинга всё и началось.
  12. йо!.. оно работает
    PS C:\> $tfs = C:\temp\get-tfs.ps1 tfs-servername
    PS C:\> $tfs.css.listallprojects() | ft Name

(Leave a comment)