Записи с меткой PowerShell

Обёртки над текстовыми командами в PowerShell

2

Хотел поделиться опытом создания простой объектно-ориентированной обёртки над обыкновенной консольной утилитой для облегчения работы с ней. Для примера была выбрана pnputil для работы с хранилищем дистрибутивов драйверов в Windows. (далее…)

PowerShell и систематизация файлов

0

Дурацкое название, но что-то лучше ничего не придумалось.

Очень быстро покажу пару скриптов, которыми я постоянно пользуюсь для поддержания моей коллекции обоев с deviantArt в относительном порядке.

Для начала, хочется заметить, что в общем случае имя файла генерируется сервером в виде my_picture_s_name_by_awesome_me.jpg, т.е. название + by + имя пользователя, приведённое к виду, пригодному для сохранения в любой файловой системе.

Итак, хранятся все картинки в одной папке – новые в корне, старые – рассортированные по авторам. От скрипта требуется умение автоматически распихивать файлы заданного вида по папкам. Решается тривиально (скрипт был написан очень давно, когда v1.0 только-только вышла и я ещё почти ничего о нём не знал):

$files = Get-ChildItem -Filter "*_by_*.???" | where {$_.GetType() -eq [System.IO.FileInfo]}
$myRegEx = New-Object System.Text.RegularExpressions.Regex('.+_by_(.+)\..{3}', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
foreach ($f in $files) {
	$dir = Join-Path $f.Directory $myRegEx.Split($f.Name)[1]
	$destination = Join-Path $dir $f.Name
	if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null }
	Move-Item -Path $f.FullName -Destination $destination -Force
}

Второй скрипт пришлось придумать только что, поскольку буквально на прошлой неделе к некоторым файлам зачем-то стали приписывать некий набор символов. Пока что я не знаю, зачем он нужен и какой у него формат, эмпирически же известно, что это семисимвольный довесок, начинающийся на d2x или d2y. Пока что будем его обрезать:

ls | where {$_.FullName -Match '.+\-[a-z0-9]{7}\.[a-z]{3,4}'} |
ren -NewName {$_.FullName -Replace '(.+)(\-[a-z0-9]{7})(\.[a-z]{3,4})','$1$3'}

Изображая Марка Русиновича

0

Я, как и многие другие люди, предпочитаю иногда не выключать компьютер, а усыплять его или вводить в гибернацию. Сильно экономит время при включении.

И вот в субботу утром (ну, ладно, полпервого дня *^_^*) я проснулся от того, что кто-то включил компьютер. Не знаю для кого как, а для меня – это один из самых неприятных способов проснуться. Ещё сильнее я удивился, повернувшись лицом к проблеме и обнаружив, что никого рядом нет.

Хм… в проявление искусственного интеллекта я не верю, поэтому мне стало очень интересно, какого лешего мой компьютер самопроизвольно включился.

Начиная с Висты, консольная утилита powercfg.exe стала просто бесценным инструментом для диагностики большинства проблем, связанных с питанием. Итак, запускаем наш любимый PowerShell:

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PowerTab version 0.99 Beta 2 PowerShell TabExpansion library
/\/\o\/\/ 2007 http://thePowerShellGuy.com
PowerTab Tabexpansion additions enabled : True
PS> powercfg -lastwake
Wake History Count - 1
Wake History [0]
  Wake Source Count - 1
  Wake Source [0]
    Type: Wake Timer
    Owner: [PROCESS] \Device\HarddiskVolume1\Windows\System32\services.exe
    Owner Supplied Reason: Windows will execute '\Microsoft\Windows\Media Center\mcupdate_scheduled' scheduled task that requested waking the computer.

Хмм… какого лешего ему понадобилось?

PS> $st = new-object -com('Schedule.Service')
PS> $st.Connect()
PS> $f = $st.GetFolder('\Microsoft\Windows\Media Center')
PS> $t = $f.GetTask('mcupdate_scheduled')
PS> $t.Definition.Actions

Id               :
Type             : 0
Path             : %SystemRoot%\ehome\mcupdate
Arguments        : -crl -hms -pscn 15
WorkingDirectory :

К сожалению, быстро поменять из PS настройки нельзя (нужно пересоздавать задание, хотя все свойства доступны для записи), поэтому пришлось делать всё руками через соответствующую оснастку консоли управления :-( .

И тут возникает вопрос: а вдруг таких подлянок несколько? А между тем, в оснастке нет поиска! Ответ, как всегда, можно найти в тандеме PowerShell + MSDN:

function Find-Wakers($path) {
  Write-Host -NoNewline '.'
  Write-Output $path.GetTasks(0) | where {
    $_.Definition.Settings.WakeToRun
  }
  foreach ($p in $path.GetFolders(0)) {
    Write-Output $(Find-Wakers($p))
  }
}
$st = new-object -com('Schedule.Service')
$st.Connect()
$tasks = @(Find-Wakers($st.GetFolder('\')))
Write-Host
$tasks | Format-Table -Property Name,Path -AutoSize 

Результат выполнения скрипта:

PS> .\Find-Wakers.ps1
.......................................................

Name           Path
----           ----
StartRecording \Microsoft\Windows\Media Center\StartRecording
Вверх