<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>wAdmin.ru &#187; Инструменты</title>
	<atom:link href="http://blog.wadmin.ru/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.wadmin.ru</link>
	<description>Записки сисадмина</description>
	<lastBuildDate>Sun, 05 Feb 2012 12:00:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Сбор запланированных заданий средствами PowerShell</title>
		<link>http://blog.wadmin.ru/2012/01/get-sched-task/</link>
		<comments>http://blog.wadmin.ru/2012/01/get-sched-task/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 07:11:13 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=5821</guid>
		<description><![CDATA[Запланированные задания. Казалось, что может быть проще..? Есть утилита schtasks.exe, она умеет собирать, создавать и удалять задания. Пишем schtasks.exe /? и далее по обстоятельствам, вернее по необходимости. Однако не все так просто как кажется. При [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-5892" title="запланированные задания" src="http://blog.wadmin.ru/wp-content/uploads/2012/01/yo-e1326956667661.jpeg" alt="запланированные задания" width="120" height="115" />Запланированные задания. Казалось, что может быть проще..?</p>
<p>Есть утилита <strong>schtasks.exe</strong>, она умеет собирать, создавать и удалять задания. Пишем</p>
<pre>schtasks.exe /?</pre>
<p>и далее по обстоятельствам, вернее по необходимости.</p>
<p>Однако не все так просто как кажется. При наличии десятка серверов все кажется простым и понятным, но при наличии 500 и более серверов задача слегка усложняется. Вполне возможно что на рабочих станциях включен планировщик и вам необходимо собрать данные по запланированному заданию которое вы назначили через GPP, как пример можно привести <a title="Управление FEP 2010 без SCCM" href="http://blog.wadmin.ru/2012/01/manage-fep-2010-without-sccm/">задачу по развертыванию</a> FEP 2010.</p>
<p><em>Примечание: Вопрос управления заданиями уже <a href="http://blog.wadmin.ru/2011/01/managing-scheduled-tasks/">обсуждался</a>, но это не мешает нам к нему вернуться.</em></p>
<p>Простой метод сбора информации о запланированных заданий приведен ниже. Скрипт формирует CSV файл который потом замечательно можно проанализировать в Excel.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="co1"># добавляем снапин от Quest</span><br />
<span class="kw1">Add-PSSnapin</span> Quest.ActiveRoles.ADManagement</p>
<p><span class="co1"># задаем нужный OU</span><br />
<span class="re0">$OU</span> <span class="sy0">=</span> <span class="st0">&#8216;Domain/Members Servers&#8217;</span></p>
<p><span class="co1"># указываем имя файла отчета</span><br />
<span class="re0">$reportFile</span> <span class="sy0">=</span> <span class="st0">&quot;report.txt&quot;</span></p>
<p><span class="re0">$servers</span> <span class="sy0">=</span> Get<span class="sy0">-</span>QADComputer <span class="sy0">-</span>SearchRoot <span class="re0">$OU</span> <span class="sy0">-</span>SearchScope Subtree</p>
<p><span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$server</span> <span class="kw3">in</span> <span class="re0">$servers</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">Write-Host</span> <span class="re0">$server</span>.dnshostname<br />
<span class="re0">$tasks</span> <span class="sy0">=</span> schtasks.exe <span class="sy0">/</span>Query <span class="sy0">/</span>FO CSV <span class="sy0">/</span>v <span class="sy0">/</span>s <span class="re0">$server</span>.dnshostname<br />
<span class="re0">$tasks</span> <span class="sy0">|</span> <span class="kw2">ft</span> HostName<span class="sy0">,</span>TaskName<span class="sy0">,</span><span class="st0">&quot;Last Run Time&quot;</span> <span class="sy0">|</span> <span class="kw1">Out<span class="kw4">-File</span></span> <span class="kw5">-NoClobber</span> <span class="kw5">-Append</span> <span class="re0">$reportFile</span><br />
<span class="co1"># если нет задачи выводить информацию в файл, а сразу получать результат на экран то можно </span><br />
<span class="co1"># сделать следующим образом.</span><br />
<span class="co1"># $tasks | ConvertFrom-Csv | ft HostName,TaskName,&quot;Last Run Time&quot;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>PS Как мне правильно заметили эта публикация является модификацией более старой <a href="http://blog.wadmin.ru/2010/04/audit-scheduled-tasks/">статьи</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2012/01/get-sched-task/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PowerShell &#8211; мониторинг состава групп</title>
		<link>http://blog.wadmin.ru/2012/01/powershell-group-member-monitoring/</link>
		<comments>http://blog.wadmin.ru/2012/01/powershell-group-member-monitoring/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 07:12:02 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=5860</guid>
		<description><![CDATA[Хороший знакомый попросим меня &#171;по быстрому&#187; набросать скрипт для мониторинга изменения участников групп в Active Directory. Получилось кривовато, но вполне работоспособно. Логика работы скрипта проста: Создаем текстовые файлы по именам групп при первом запуске. При следующих запусках [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3915" title="powershell" src="http://blog.wadmin.ru/wp-content/uploads/2011/07/powershell-e1323611870272.png" alt="powershell" width="120" height="120" />Хороший знакомый попросим меня &laquo;по быстрому&raquo; набросать скрипт для мониторинга изменения участников групп в Active Directory.</p>
<p>Получилось кривовато, но вполне работоспособно. Логика работы скрипта проста:</p>
<ul>
<li>Создаем текстовые файлы по именам групп при первом запуске.</li>
<li>При следующих запусках сравниваем текущее состояние с тем что есть в старых файлах.</li>
<li>При необходимости пишем в файл отчета.</li>
<li>Удаляем старый файл, создаем новый и записываем в него состав группы.</li>
</ul>
<p>На всякий случай текст скрипта в текстовом формате &#8211; <a href="http://blog.wadmin.ru/downloads/adGroupCheck.ps1.txt">скачать</a>.</p>
<p><em>Примечание: По мере &laquo;шлифовки&raquo; будут вносится правки.</em></p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="co1"># добавляем снапин от Quest</span><br />
<span class="kw1">Add-PSSnapin</span> Quest.ActiveRoles.ADManagement</p>
<p><span class="co1"># задаем формат даты</span><br />
<span class="re0">$currentDate</span> <span class="sy0">=</span> <span class="kw1">Get-Date</span> <span class="kw5">-format</span> M.d.yyyy</p>
<p><span class="co1"># указываем нужные пути и файл отчета</span><br />
<span class="re0">$reportFolder</span> <span class="sy0">=</span> <span class="st0">&quot;D:\Scripts\Powershell\GroupCheck\&quot;</span><br />
<span class="re0">$report</span> <span class="sy0">=</span> <span class="st0">&quot;D:\Scripts\Powershell\$($currentDate)_report.txt&quot;</span></p>
<p><span class="co1"># собираем данные о группах</span><br />
<span class="re0">$groups</span> <span class="sy0">=</span> Get<span class="sy0">-</span>QADGroup <span class="sy0">-</span>SizeLimit 0<br />
<span class="re0">$PreviousDay</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="br0">&#123;</span><span class="br0">&#125;</span></p>
<p><span class="co1"># функция сравнения </span><br />
<span class="kw3">function</span> CompareResults <span class="br0">&#40;</span><span class="re0">$query</span><span class="sy0">,</span> <span class="re0">$group</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$result</span> <span class="kw3">in</span> <span class="re0">$query</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># пользователь добавлен в группу</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$result</span>.SideIndicator <span class="kw4">-eq</span> <span class="st0">&quot;=&gt;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Write-Output</span> <span class="st0">&quot;User added &#8211; $($result.InputObject.NTAccountName)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;Group $($group). add user &#8211; $($result.InputObject.NTAccountName)&quot;</span> <span class="sy0">|</span> <span class="kw1">Out<span class="kw4">-File</span></span> <span class="kw5">-Append</span> <span class="re0">$report</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># пользователь удален из группы</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$result</span>.SideIndicator <span class="kw4">-eq</span> <span class="st0">&quot;&lt;=&quot;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Write-Output</span> <span class="st0">&quot;User removed &#8211; $($result.InputObject)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;Group $($group). remove user &#8211; $($result.InputObject)&quot;</span> <span class="sy0">|</span> <span class="kw1">Out<span class="kw4">-File</span></span> <span class="kw5">-Append</span> <span class="re0">$report</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$group</span> <span class="kw3">in</span> <span class="re0">$Groups</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$fileName</span> <span class="sy0">=</span> <span class="re0">$reportFolder</span> <span class="sy0">+</span> <span class="re0">$group</span> <span class="sy0">+</span> <span class="st0">&quot;.txt&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span><span class="kw1">Test-Path</span> <span class="re0">$fileName</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">New-Item</span> <span class="re0">$fileName</span> <span class="kw5">-ItemType</span> file <span class="kw5">-Force</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$PreviousDay</span><span class="br0">&#91;</span><span class="re0">$group</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw1">Get-Content</span> <span class="re0">$fileName</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$MemberList</span> <span class="sy0">=</span> Get<span class="sy0">-</span>QADGroupMember <span class="re0">$group</span> <span class="sy0">-</span>SizeLimit 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$PreviousList</span> <span class="sy0">=</span> <span class="kw1">Get-Content</span> <span class="re0">$fileName</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp;<span class="kw3">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$MemberList</span> <span class="kw4">-ne</span> <span class="re0">$null</span><span class="br0">&#41;</span> <span class="kw4">-and</span> <span class="br0">&#40;</span><span class="re0">$PreviousList</span> <span class="kw4">-eq</span> <span class="re0">$null</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$user</span> <span class="kw3">in</span> <span class="re0">$MemberList</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Write-Output</span> <span class="st0">&quot;$($group): Add user – $($user.NTAccountName)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw3">elseif</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$MemberList</span> <span class="kw4">-eq</span> <span class="re0">$null</span><span class="br0">&#41;</span> <span class="kw4">-and</span> <span class="br0">&#40;</span><span class="re0">$PreviousList</span> <span class="kw4">-ne</span> <span class="re0">$null</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$user</span> <span class="kw3">in</span> <span class="re0">$PreviousList</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Write-Output</span> <span class="st0">&quot;$($group): Remove user – $user&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw3">elseif</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$MemberList</span> <span class="kw4">-ne</span> <span class="re0">$null</span><span class="br0">&#41;</span> <span class="kw4">-and</span> <span class="br0">&#40;</span><span class="re0">$PreviousList</span> <span class="kw4">-ne</span> <span class="re0">$null</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># анализ группы</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Write-Output</span> <span class="st0">&quot;Check group – $($group)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$DiffResult</span> <span class="sy0">=</span> <span class="kw2">diff</span> <span class="kw5">-ReferenceObject</span> <span class="re0">$PreviousList</span> <span class="kw5">-DifferenceObject</span> <span class="re0">$MemberList</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompareResults <span class="re0">$DiffResult</span> <span class="re0">$group</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># пустая группа</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">Write-Output</span> <span class="st0">&quot;Group $group – has no members&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$MemberList</span> <span class="sy0">|</span> <span class="kw1">Select-Object</span> <span class="kw5">-Expand</span> NTAccountName <span class="sy0">|</span> <span class="kw1">Out<span class="kw4">-File</span></span> <span class="re0">$fileName</span><br />
<span class="br0">&#125;</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2012/01/powershell-group-member-monitoring/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PowerShell и контроль версий</title>
		<link>http://blog.wadmin.ru/2012/01/powershell-version-control/</link>
		<comments>http://blog.wadmin.ru/2012/01/powershell-version-control/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 10:53:21 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[GIT]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=5641</guid>
		<description><![CDATA[Вы используете контроль версий для своих скриптов на PowerShell? Я использую, причем очень давно. До недавнего времени я предпочитал Subversion и искоса посматривал на Git, в первом есть как и плюсы так и минусы, надо сказать [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3915" title="powershell" src="http://blog.wadmin.ru/wp-content/uploads/2011/07/powershell-e1323611870272.png" alt="powershell" width="120" height="120" />Вы используете контроль версий для своих скриптов на PowerShell?</p>
<p>Я использую, причем очень давно. До недавнего времени я предпочитал Subversion и искоса посматривал на Git, в первом есть как и плюсы так и минусы, надо сказать что Subversion гадит за собой как небольшое стадо носорогов <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , второй аккуратен, практичен, но управлять им, мягко выражаясь в среде Windows, слегка &laquo;запарно&raquo;. Конечно есть и графические средства управления, которые убирают все неудобства, но об этом в самом конце статьи.</p>
<p><em>Примечание: <strong>Git</strong> — распределённая система управления версиями файлов. Этот проект был создан Линусом Торвальдсом для управления разработкой ядра Linux.</em></p>
<p>- Похоже на нелепость&#8230; При чем тут PowerShell? &#8211; скажете вы.<br />
- Ни сколько и очень даже при чем&#8230; &#8211; будет мой ответ.</p>
<p>Главным отличием от SVN является то, что в Git нет такого понятия как главный репозиторий. Разработчик тихо себе сидит и мучает свою локальную версию репозитория в которую делает commit&#8217;ы и при необходимости, синхронизирует все изменения с репозиторием, располагающимся на сервере. Причем стоит отметить что наличие сервера необязательно&#8230;</p>
<p>Для чего нужна система контроля версий и какие плюсы вы сможете получить?</p>
<ul>
<li>Хранение версий файлов, причем хранятся только изменения между предыдущей и текущей версией, это обеспечивает компактное хранение всей истории изменений на дисках.</li>
<li>Возможность получать, в случае необходимости, любые предыдущие версии файлов т.е. возможность отката на любую версию файла.</li>
<li>Просмотр и анализ внесенных внесенных изменений.</li>
</ul>
<p>Предлагаю по шагам пройти путь от установки Git до примера его использования.</p>
<h3>Шаг 1: Установка MSysGit</h3>
<p>Переходим по <a href="http://code.google.com/p/msysgit/downloads/list" rel="nofollow" target="_blank">ссылке</a>, загружаем файл &#8216;full installer&#8217;. Запускаем установку.</p>
<p>По завершению установки вы получите как консольную версию, включающую SSH-клиент, так и графическую.</p>
<h3>Шаг 2: Настройка</h3>
<p>Ищет файл <strong>.gitconfig</strong> в каталоге <strong>$HOME</strong>. Кроме того Git ищет файл /etc/gitconfig, но уже относительно корневого каталога MSys, который находится там, куда вы решили установить Git, когда запускали инсталлятор.</p>
<h4>Имя пользователя</h4>
<p>Первое, что необходимо это указать ваше имя и адрес электронной почты. Это нужно для того что бы в каждом коммите, это обязательная информация передаваемая с данными и она не может быть далее изменена:</p>
<pre>$ git config --global user.name "Test User"
$ git config --global user.email test.user@example.com</pre>
<p>Данная настройка выполняется один раз, если вы указываете параметр &#8211;global, и Git будет использовать эти данные для всех создаваемых проектов, но если вы захотите указать другое имя или электронную почту для конкретных проектов, можно выполнить команду без параметра &#8211;global в каталоге с нужным проектом.</p>
<h3>Шаг 3: Проверка настроек</h3>
<p>Для проверки настроек используется команда</p>
<pre>git config --list</pre>
<p>Значение конкретного ключа можно проверить, выполнив команду</p>
<pre>git config {ключ}</pre>
<h3>Шаг 4: Создание репозитория Git</h3>
<p>Создание репозитория в Git осуществляется двумя методами. Первый это импорт в Git уже существующего проекта или каталога. Второй — клонирование уже существующего репозитория с сервера. В рамках этой статьи мы не будем рассматривать второй метод и остановимся подробнее только на первом.</p>
<h4>Создание репозитория в существующем каталоге</h4>
<p>Переходим в существующий каталог и в командной строке вводим.</p>
<pre>$ git init</pre>
<p>Результатом выполнения команды будет создание подкаталога с именем .git в котором будут находится все необходимые файлы репозитория.</p>
<h4>Добавление файлов в индекс</h4>
<p>Создайте файл README, внесите в него произвольное содержимое и выполните следующие команды</p>
<pre>$ git add README
$ git commit -m 'initial project version'</pre>
<p>Мы разберем, что делают эти команды чуть позже. В данный момент, у нас уже есть Git-репозиторий с одним файлом и начальным коммитом.</p>
<h4>Фиксация изменений</h4>
<p>Теперь, когда репозиторий настроен, вы можете производить фиксацию всех изменений. Стоит учитывать что то что до сих пор не проиндексировано — любые файлы, созданные или измененные вами, для которых не была выполнена команда</p>
<pre>$ git add</pre>
<p>после момента редактирования — не войдут в очередной коммит и при выполнении команды</p>
<pre>$ git status</pre>
<p>вы увидите только то что уже было добавлено (проиндексировано). Что бы зафиксировать изменения введите команду</p>
<pre>$ git commit</pre>
<h4>Удаление файлов</h4>
<p>Процедуру удаления файла из репозитория могли бы сделать получше, на текущий момент не достаточно удалить файл с диска, вам придется удалить его из отслеживаемых файлов (если быть точнее, удалить его из индекса) а затем выполнить коммит. Это действие выполняется командой</p>
<pre>git rm</pre>
<p>которая также удаляет файл из вашего рабочего каталога.<br />
Штука которая может понадобится это удаление файла из индекса, но с условием того что он останется на диске.</p>
<pre>$ git rm --cached readme.txt</pre>
<p>В команду <strong>git rm</strong> вы можете передавать файлы по маске, каталоги или даже glob-шаблоны. Примерно так:</p>
<pre>$ git rm log/\*.log</pre>
<p>Примечание: Обратный слэш &laquo;\&raquo; перед &raquo;*&raquo;. обязателен, так как в Git есть собственный обработчик имён файлов в добавок к обработчику вашего командного интерпретатора.</p>
<h4>Перемещение файлов</h4>
<p>Немного нелогичным, но после понимания вполне понятным, кажется то Git не отслеживает перемещение файла. Если вы переименуете файл, то в Git не сохранится никаких данных о том, что вы что то переименовывали.</p>
<p>Таким образом наличие в Git команды</p>
<pre>mv</pre>
<p>выглядит несколько странным. Если вам хочется переименовать файл в Git, вы можете сделать так:</p>
<pre>$ mv README.txt README
$ git rm README.txt
$ git add README</pre>
<h4>Восстановление файлов</h4>
<p>Последняя операция которая нам может понадобится это восстановление файлов из репозитория.  Предположим что вы что то &laquo;накосячили&raquo; и необходимо выполнить откат.</p>
<p>Восстанавливаем файл до последней ревизии.</p>
<pre>git checkout HEAD README</pre>
<p>Если требуется восстановить файл до определенной ревизии то сначала вводим команду</p>
<pre>git log README</pre>
<p>По полученной из описания коммита информации определяем номер ревизии и вводим:</p>
<pre>git checkout [rev] README</pre>
<h3>Пример</h3>
<p>Предположим что вы собираетесь взять под контроль git папку со скриптами D:\Scripts. Для получения результата вам потребуется ряд простых действий.<br />
1. Переходим в папку d:\Scripts и выполняем инициализацию репозитория</p>
<pre>cd d:\scripts
git init</pre>
<p>2. Добавляем все  содержимое в репозиторий.</p>
<pre>git add .</pre>
<p>3. Выполняем первый коммит</p>
<pre>git commit -m "initial commit"</pre>
<p>Собственно все&#8230;</p>
<p>Теперь вам доступна история изменений и вы можете, вы можете производить откат на любую точку.</p>
<h3>Итог</h3>
<p>Предоставленных примеров вполне достаточно для того что бы начать использовать Git в повседневной работе, но если вам показались сложными манипуляции в консоли то я настоятельно рекомендую вам использовать <a href="http://code.google.com/p/tortoisegit/" rel="nofollow" target="_blank">tortoisegit</a> т.к. это вполне понятный и удобный графический клиент для Git. Он позволяет в привычном для всех проводнике выполнять все необходимые действия.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2012/01/powershell-version-control/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Получаем Uptime в Windows.</title>
		<link>http://blog.wadmin.ru/2011/12/windows-uptime/</link>
		<comments>http://blog.wadmin.ru/2011/12/windows-uptime/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 08:55:34 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=5529</guid>
		<description><![CDATA[Когда то давно вопрос получение uptime от серверов уже поднимался, но в предновогодние дни стоит затронуть его еще раз&#8230; Назову причину &#8211; коллега забыл про сервер разработки и его аптайм до вчерашнего дня составил 832 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-5547" title="uptime" src="http://blog.wadmin.ru/wp-content/uploads/2011/12/uptime-e1325062702824.jpg" alt="uptime" width="120" height="110" />Когда то давно вопрос <a href="http://blog.wadmin.ru/2009/10/servers-uptime/">получение uptime</a> от серверов уже поднимался, но в предновогодние дни стоит затронуть его еще раз&#8230;</p>
<p>Назову причину &#8211; коллега забыл про сервер разработки и его аптайм до вчерашнего дня составил 832 дня !</p>
<p><em>Молиться надо на таких разработчиков раз они не только не уронили, но и не доставали более двух лет <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<p>В любом случае на цифирьки посмотреть не мешает, при большом аптайме, как минимум не установлены критические обновления. И закончится это может в любой момент и вероятность того что закончится оно &laquo;плохо&raquo; или &laquo;могло быть и лучше если бы почесались&raquo;&#8230;</p>
<p>Да простят меня &laquo;линуксоиды&raquo;, мерится аптаймами не будем <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  просто посмотрим как можно получить нужную цифру и на методики получения информации о том сколько у нас отработала система.</p>
<p><em>Примечание: Коллеги линукс-админы, это не камень в ваш огород, я знаю много отличных специалистов, но в ваших рядах затесались (в семье не без урода) те кто свято верит в то что сервер с ядром 2.2 и аптаймом в 5 лет совершенно безопасен и стабилен (при этом сервер светится как новогодняя елка во внешний мир). Я не поддерживаю такого и чаще всего просто не понимаю. Дискуссии про то что линукс мега надежен и супер стабилен и про то что виндофс  бяка поддерживать не буду. Надеюсь на понимание.</em></p>
<p>Специально для тех кто забывает про серверы&#8230;</p>
<h3>Используем Диспетчер Задач</h3>
<p>В Windows Vista и Windows Server 2008, в диспетчере задач есть возможность посмотреть аптайм.</p>
<ol>
<li>На таскбаре жмем мышом и выбираем Task Manager. Можно использовать комбинацию CTRL+SHIFT+ESC. Тут уж кто как привык.</li>
<li>Выбираем вкладку Performance.</li>
<li>В свойствах System видим нужное значение.</li>
</ol>
<p><img class="aligncenter size-full wp-image-5534" title="taskmgr" src="http://blog.wadmin.ru/wp-content/uploads/2011/12/taskmgr.png" alt="taskmgr" width="400" height="409" /></p>
<p><em>Примечание: К сожалению данная методика не доступна в Windows 2003. </em></p>
<h3>Используем утилиту systeminfo</h3>
<p>Меня часто удивляет тот факт что про утилиту systeminfo почему то все забывают. Тем не менее она дает не только массу информации, но и нужное нам значение последней загрузки системы.</p>
<p>Открываем командную строку и вводим:</p>
<pre>systeminfo | find "System Boot Time:"</pre>
<p><img class="aligncenter size-full wp-image-5535" title="systeminfo" src="http://blog.wadmin.ru/wp-content/uploads/2011/12/systeminfo.png" alt="systeminfo" width="481" height="205" /></p>
<p>&nbsp;</p>
<h3>Утилита Uptime</h3>
<p>Для удобства Microsoft сделал довольно полезный инструмент который можно получить по ссылке:</p>
<p><a href="http://support.microsoft.com/kb/232243" rel="nofollow" target="_blank">http://support.microsoft.com/kb/232243</a></p>
<p>Для использования необходимо:</p>
<ul>
<li>Загрузить утилиту.</li>
<li>Запихнуть ее в папку которая включена в переменную %PATH%</li>
<li>Для получения справки используйте ключ /?</li>
<li>Если справка не требуется то вводите.
<pre>uptime.exe</pre>
</li>
</ul>
<p><img class="aligncenter size-full wp-image-5536" title="uptime" src="http://blog.wadmin.ru/wp-content/uploads/2011/12/uptime.png" alt="uptime" width="450" height="73" /></p>
<h3>Используем утилиту NET STATISTICS</h3>
<p>В выводе команды:</p>
<pre>net statistics workstation</pre>
<p>Среди предоставленной информации есть время последней загрузки системы</p>
<p><img class="aligncenter size-full wp-image-5537" title="statistics" src="http://blog.wadmin.ru/wp-content/uploads/2011/12/statistics.png" alt="statistics" width="450" height="173" /></p>
<h3>Используем Event Viewer</h3>
<p>Метод заключен в поиске сообщения с кодом 6005 (запуск сервиса EventLog) от источника EventLog и события с кодом 6006 (остановка сервиса EventLog)</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw1">Get-EventLog</span> <span class="kw5">-LogName</span> system <span class="sy0">|</span> <span class="kw1">Where-Object</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.EventID <span class="kw4">-eq</span> 6005 <span class="kw4">-or</span> <a href="about:blank"><span class="kw6">$_</span></a>.EventID <span class="kw4">-eq</span> 6006<span class="br0">&#125;</span> <span class="sy0">|</span> <span class="kw2">Select</span> TimeGenerated<span class="sy0">,</span> EventID</div>
</div>
<p>Естественно эту же информацию легко получить с удаленного хоста введя команду:</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw1">Get-EventLog</span> <span class="kw5">-LogName</span> system <span class="sy0">-</span>Computer HOST_NAME <span class="sy0">-</span>Credentil <span class="br0">&#40;</span><span class="kw1">Get-Credential</span><span class="br0">&#41;</span><span class="sy0">|</span> <span class="kw1">Where-Object</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.EventID <span class="kw4">-eq</span> 6005 <span class="kw4">-or</span> <a href="about:blank"><span class="kw6">$_</span></a>.EventID <span class="kw4">-eq</span> 6006<span class="br0">&#125;</span> <span class="sy0">|</span> <span class="kw2">Select</span> TimeGenerated<span class="sy0">,</span> EventID</div>
</div>
<p>Более просто этот метод реализуется просмотром журнала System и поиска событий с кодами 6005 и 6006.<br />
<img class="aligncenter size-full wp-image-5538" title="system-uptime" src="http://blog.wadmin.ru/wp-content/uploads/2011/12/system-uptime-e1325054128372.png" alt="system-uptime" width="600" height="417" /></p>
<h3>Используем WMI</h3>
<p>У WMI класса <strong>Win32_PerfFormattedData_PerfOS_System</strong> есть счетчик SystemUptime, который можно использовать для получения необходимого значения.</p>
<div class="codesnip-container" >
<div class="vb codesnip" style="font-family:monospace;"># указываем текущий компьютер<br />
strComputer = <span class="st0">&quot;.&quot;</span><br />
<span class="kw1">Set</span> objWMIService = GetObject(<span class="st0">&quot;winmgmts:\\&quot;</span> &amp; strComputer &amp; <span class="st0">&quot;\root\cimv2&quot;</span>)<br />
<span class="kw1">Set</span> colOperatingSystems = objWMIService.ExecQuery (<span class="st0">&quot;Select * From Win32_PerfFormattedData_PerfOS_System&quot;</span>)</p>
<p><span class="kw1">For</span> <span class="kw1">Each</span> objOS <span class="kw1">in</span> colOperatingSystems<br />
# для получения минут делим SystemUpTime на 60<br />
intSystemUptime = Int(objOS.SystemUpTime / 60)<br />
strMessage = <span class="st0">&quot;System uptime is &quot;</span> &amp; intSystemUptime &amp; <span class="st0">&quot; minutes&quot;</span><br />
msgBox strMessage, 0, <span class="st0">&quot;System Uptime&quot;</span><br />
<span class="kw1">Next</span></div>
</div>
<p>Можно использовать LastBootUpTime из класса Win32_OperatingSystem, но об этом в следующем методе.</p>
<h3>Используем PowerShell</h3>
<p>В данном методе используется WMI класс <strong>Win32_OperatingSystem</strong> и разница по времени между LocalDateTime и LastBootUpTime.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="re0">$wmi</span> <span class="sy0">=</span> <span class="kw1">Get-WmiObject</span> <span class="kw5">-Class</span> Win32_OperatingSystem<br />
<span class="re0">$wmi</span>.ConvertToDateTime<span class="br0">&#40;</span><span class="re0">$wmi</span>.LocalDateTime<span class="br0">&#41;</span> – <span class="re0">$wmi</span>.ConvertToDateTime<span class="br0">&#40;</span><span class="re0">$wmi</span>.LastBootUpTime<span class="br0">&#41;</span></div>
</div>
<p>Получаемся не совсем аккуратная &laquo;простыня&raquo;</p>
<pre>Days              : 12
Hours             : 22
Minutes           : 18
Seconds           : 29
Milliseconds      : 912
Ticks             : 11171099124010
TotalDays         : 12,9295128750116
TotalHours        : 310,308309000278
TotalMinutes      : 18618,4985400167
TotalSeconds      : 1117109,912401
TotalMilliseconds : 1117109912,401</pre>
<p>Более компактного вывода можно добиться командой которая дает немножко нестандартный, но все же вывод.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="br0">&#91;</span>math<span class="br0">&#93;</span>::round<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">Get-Date</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="br0">&#40;</span><span class="re0">$q</span><span class="sy0">=</span><span class="kw2">gwmi</span> Win32_OperatingSystem<span class="br0">&#41;</span>.ConvertToDateTime<span class="br0">&#40;</span><span class="re0">$q</span>.lastbootuptime<span class="br0">&#41;</span><span class="br0">&#41;</span>.TotalDays<span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span></div>
</div>
<p>Более наглядный вариант умеющий выводить в файл результаты:</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><a href="about:blank"><span class="kw6">$ErrorActionPreference</span></a> <span class="sy0">=</span> <span class="st0">&quot;SilentlyContinue&quot;</span><br />
<span class="re0">$reportFile</span> <span class="sy0">=</span> <span class="st0">&quot;D:\Scripts\Output\LastReboot.htm&quot;</span><br />
<span class="re0">$reportFolder</span> <span class="sy0">=</span> <span class="st0">&quot;D:\Scripts\Output&quot;</span><br />
<span class="kw1">Remove-Item</span> <span class="re0">$reportFolder</span> <span class="kw5">-Recurse</span></p>
<p><span class="re0">$InputFile</span> <span class="sy0">=</span> <span class="kw1">Get-Content</span> Servers.txt<br />
<span class="re0">$LastReboot</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$computer</span> <span class="kw3">in</span> <span class="re0">$InputFile</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$q</span> <span class="sy0">=</span> <span class="st0">&quot;&quot;</span> <span class="sy0">|</span> <span class="kw1">Select-Object</span> <span class="st0">&#8216;Machine Name&#8217;</span><span class="sy0">,</span><span class="st0">&#8216;Last Reboot TimeStamp&#8217;</span><span class="sy0">,</span><span class="st0">&#8216;Reboot Initiator&#8217;</span><span class="sy0">,</span><span class="st0">&#8216;Reboot Reason Code&#8217;</span><br />
<span class="re0">$q</span>.<span class="st0">&#8216;Machine Name&#8217;</span> <span class="sy0">=</span> <span class="re0">$computer</span><br />
<span class="re0">$q</span>.<span class="st0">&#8216;Last Reboot TimeStamp&#8217;</span> <span class="sy0">=</span> <span class="br0">&#91;</span>Management.ManagementDateTimeConverter<span class="br0">&#93;</span>::ToDateTime<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">Get-WmiObject</span> <span class="kw5">-class</span> Win32_OperatingSystem <span class="kw5">-computername</span> <span class="re0">$computer</span> <span class="kw5">-namespace</span> <span class="st0">&quot;root\CIMV2&quot;</span><span class="br0">&#41;</span>.LastBootUpTime<span class="br0">&#41;</span><br />
<span class="re0">$LastReboot</span> <span class="sy0">+=</span> <span class="re0">$q</span><br />
<span class="br0">&#125;</span><br />
<span class="kw1">New-Item</span> <span class="re0">$reportFolder</span> <span class="kw5">-ItemType</span> directory</p>
<p><span class="re0">$LastReboot</span> <span class="sy0">|</span> <span class="kw1">Sort-Object</span> <span class="st0">&#8216;Last Reboot TimeStamp&#8217;</span> <span class="kw5">-Descending</span> <span class="sy0">|</span> <span class="kw1">ConvertTo-Html</span> <span class="sy0">|</span> <span class="kw1">Out<span class="kw4">-File</span></span> <span class="re0">$reportFile</span><br />
<span class="kw1">Invoke-Expression</span> $reportFile</div>
</div>
<p>PS несмотря на обилие методик я все же предпочитаю &laquo;дедовский метод&raquo; &#8211; утилиту uptime.exe.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/12/windows-uptime/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Быстрое создание hostlist.txt</title>
		<link>http://blog.wadmin.ru/2011/11/create-hostlist-file/</link>
		<comments>http://blog.wadmin.ru/2011/11/create-hostlist-file/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 06:48:12 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=4880</guid>
		<description><![CDATA[Я неоднократно писал про то что использую в работе файл servers.txt или hostlist.txt, но ни разу не показывал как именно я собираю данные. Вариантов масса &#8211; можно экспортировать данные из оснастки ADUC, можно рисовать руками, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-5055" title="hostlist.txt" src="http://blog.wadmin.ru/wp-content/uploads/2011/11/hostlist.jpg" alt="hostlist.txt" width="120" height="141" />Я неоднократно писал про то что использую в работе файл <strong>servers.txt</strong> или <strong>hostlist.txt</strong>, но ни разу не показывал как именно я собираю данные.</p>
<p>Вариантов масса &#8211; можно экспортировать данные из оснастки ADUC, можно рисовать руками, но лучше скриптом.</p>
<p>Для работы скрипта должен быть установлен модуль Active Directory Module for PowerShell (из пакета RSAT). Естественно запускаться это все должно на Windows 7.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="co1"># импортируем модуль ActiveDirectory</span><br />
Import<span class="sy0">-</span>Module ActiveDirectory<br />
<span class="co1"># Указываем путь для поиска</span><br />
<span class="re0">$base</span> <span class="sy0">=</span> <span class="st0">&#8216;OU=Servers,DC=domain,DC=local&#8217;</span><br />
<span class="co1"># на всякий случай берем только свежие записи</span><br />
<span class="re0">$d</span> <span class="sy0">=</span> <span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span>::Today.AddDays<span class="br0">&#40;</span><span class="sy0">-</span><span class="nu0">30</span><span class="br0">&#41;</span><br />
<span class="co1"># выполняем поиск</span><br />
<span class="re0">$computers</span> <span class="sy0">=</span> Get<span class="sy0">-</span>ADComputer <span class="sy0">-</span><span class="kw3">Filter</span> <span class="st0">&#8216;PasswordLastSet -ge $d&#8217;</span> <span class="sy0">-</span>Searchbase <span class="re0">$base</span><br />
<span class="co1"># выводим результаты в файл hostlist.txt</span><br />
<span class="kw3">foreach</span><span class="br0">&#40;</span><span class="re0">$computer</span> <span class="kw3">in</span> <span class="re0">$computers</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$computer</span>.Name <span class="sy0">|</span> <span class="kw1">Out<span class="kw4">-file</span></span> hostlist.txt <span class="kw5">-append</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>PS уверен что приведенный ниже скрипт можно упростить <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Выкладывайте свои варианты в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/11/create-hostlist-file/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Powershell &#8211; тестируем соединение (ping)</title>
		<link>http://blog.wadmin.ru/2011/07/powershell-ping/</link>
		<comments>http://blog.wadmin.ru/2011/07/powershell-ping/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 08:30:27 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3963</guid>
		<description><![CDATA[Казалось бы нет ничего проще команды ping. Команда известна всем, ключей у нее немного и ничего нового в её использовании уже придумать нельзя, но на помощь приходит powershell и моя бурная фантазия. Давайте посмотрим что [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3965" title="Ping" src="http://blog.wadmin.ru/wp-content/uploads/2011/07/Ping_pong_1.jpg" alt="ping" width="150" height="113" />Казалось бы нет ничего проще команды ping. Команда известна всем, ключей у нее немного и ничего нового в её использовании уже придумать нельзя, но на помощь приходит powershell и моя бурная фантазия.</p>
<p>Давайте посмотрим что нам может дать powershell и желание усложнить себе жизнь <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Для начала, вспомним к чему приходилось прибегать для того что бы пропинговать диапазон.</p>
<pre>C:\&gt;for /L %i in (1,1,255) do @ping -n 1 192.168.1.%i | find "Reply"</pre>
<p>Получался вот такой вывод. Причем не факт что он &laquo;получался&raquo;&#8230; Если хост не ответил с первой попытки то в список он не попадал (<strong>ping -n 1</strong>)</p>
<pre>Reply from 192.168.1.10: bytes=32 time=4ms TTL=64
Reply from 192.168.1.32: bytes=32 time=5ms TTL=64
Reply from 192.168.1.35: bytes=32 time=4ms TTL=64</pre>
<p>Того же результата, но в более красивым выводом можно добиться на powerhsell</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw2">PS</span> C:\<span class="sy0">&amp;</span>gt;1..255 <span class="sy0">|</span> <span class="kw1">foreach-object</span> <span class="br0">&#123;</span> <span class="br0">&#40;</span><span class="kw1">new-object</span> System.Net.Networkinformation.Ping<span class="br0">&#41;</span>.Send<span class="br0">&#40;</span><span class="st0">&quot;192.168.1.$_&quot;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span> <span class="sy0">|</span> <span class="kw1">where-object</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.Status <span class="kw4">-eq</span> <span class="st0">&quot;success&quot;</span><span class="br0">&#125;</span> <span class="sy0">|</span> <span class="kw2">select</span> Address</div>
</div>
<p>Результат выглядит так.</p>
<pre>Address
———-
192.168.1.10
192.168.1.32
192.168.1.35</pre>
<p>- О чем на говорят цифры разделенные точками?<br />
- Это только IP адреса! &#8211; скажете вы.</p>
<p>Можно несколько модифицировать предложенный ранее пример и украсить его вывод.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;">1..255 <span class="sy0">|</span> <span class="kw1">foreach-object</span> <span class="br0">&#123;</span> <span class="br0">&#40;</span><span class="kw1">new-object</span> System.Net.Networkinformation.Ping<span class="br0">&#41;</span>.Send<span class="br0">&#40;</span><span class="st0">&quot;192.168.1.$_&quot;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span> <span class="sy0">|</span> <span class="kw1">where-object</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.Status <span class="kw4">-eq</span> <span class="st0">&quot;success&quot;</span><span class="br0">&#125;</span> <span class="sy0">|</span> <span class="kw1">foreach-object</span> <span class="br0">&#123;</span> nslookup <a href="about:blank"><span class="kw6">$_</span></a>; <span class="kw2">gci</span> <span class="st0">&quot;\\$($_.Address)\c$&quot;</span>; <span class="kw2">echo</span> <span class="st0">&quot;Good&quot;</span> <span class="br0">&#125;</span></div>
</div>
<p>Придумать что то еще уже кажется невозможным, но следующий пример говорит обратное. Для тех кому консоль враждебна можно порекомендовать методику, в которой показывается как можно отправить результат в Excel.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="re0">$erroractionpreference</span> <span class="sy0">=</span> <span class="st0">&quot;SilentlyContinue&quot;</span><br />
<span class="re0">$a</span> <span class="sy0">=</span> <span class="kw1">New-Object</span> <span class="kw5">-comobject</span> Excel.Application<br />
<span class="re0">$a</span>.visible <span class="sy0">=</span> <span class="re0">$True</span><br />
<span class="re0">$b</span> <span class="sy0">=</span> <span class="re0">$a</span>.Workbooks.Add<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="re0">$c</span> <span class="sy0">=</span> <span class="re0">$b</span>.Worksheets.Item<span class="br0">&#40;</span>1<span class="br0">&#41;</span></p>
<p><span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">&quot;Machine Name&quot;</span><br />
<span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">&quot;Ping Status&quot;</span><br />
<span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">&quot;Hostname&quot;</span></p>
<p><span class="re0">$d</span> <span class="sy0">=</span> <span class="re0">$c</span>.UsedRange<br />
<span class="re0">$d</span>.Interior.ColorIndex <span class="sy0">=</span> 19<br />
<span class="re0">$d</span>.Font.ColorIndex <span class="sy0">=</span> 11<br />
<span class="re0">$d</span>.Font.Bold <span class="sy0">=</span> <span class="re0">$True</span><br />
<span class="re0">$d</span>.EntireColumn.AutoFit<span class="br0">&#40;</span><span class="re0">$True</span><span class="br0">&#41;</span></p>
<p><span class="re0">$intRow</span> <span class="sy0">=</span> 2</p>
<p><span class="re0">$colComputers</span> <span class="sy0">=</span> <span class="kw1">get-content</span> C:\servers.txt<br />
<span class="kw3">foreach</span> <span class="br0">&#40;</span><span class="re0">$strComputer</span> <span class="kw3">in</span> <span class="re0">$colComputers</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<span class="re0">$hostname</span> <span class="sy0">=</span> <span class="br0">&#91;</span>System.Net.Dns<span class="br0">&#93;</span>::GetHostbyAddress<span class="br0">&#40;</span><span class="re0">$strcomputer</span><span class="br0">&#41;</span>.hostname<br />
<span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="re0">$intRow</span><span class="sy0">,</span> 1<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="re0">$strComputer</span>.ToUpper<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="re0">$ping</span> <span class="sy0">=</span> <span class="kw1">new-object</span> System.Net.NetworkInformation.Ping<br />
<span class="re0">$Reply</span> <span class="sy0">=</span> <span class="re0">$ping</span>.send<span class="br0">&#40;</span><span class="re0">$strComputer</span><span class="br0">&#41;</span><br />
<span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$Reply</span>.status –eq <span class="st0">&quot;Success&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="re0">$intRow</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">&quot;Online&quot;</span><br />
<span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span><br />
<span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="re0">$intRow</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">&quot;Offline&quot;</span><br />
<span class="br0">&#125;</span><br />
<span class="re0">$Reply</span> <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><br />
<span class="re0">$c</span>.Cells.Item<span class="br0">&#40;</span><span class="re0">$intRow</span><span class="sy0">,</span> <span class="nu0">3</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="st0">&quot;$hostname&quot;</span><br />
<span class="re0">$intRow</span> <span class="sy0">=</span> <span class="re0">$intRow</span> <span class="sy0">+</span> 1<br />
<span class="br0">&#125;</span><br />
<span class="re0">$d</span>.EntireColumn.AutoFit<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p>Развивая мысль мы можем с помощью команды <strong>Test-Connection</strong> выполнить тестирование соединений с узлами в подсети 192.168.0.Х в диапазоне 1-255. Вывод результата выглядит просто &#8211; если хост доступен то пишется <span style="color: green;"><strong>UP</strong></span>, если нет то <span style="color: red;"><strong>DOWN</strong></span>.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;">1..255 <span class="sy0">|</span> <span class="sy0">%</span><span class="br0">&#123;</span><span class="re0">$result</span> <span class="sy0">=</span> Test<span class="sy0">-</span>Connection <span class="kw5">-ComputerName</span> <span class="st0">&quot;192.168.0.$_&quot;</span> <span class="kw5">-Count</span> 1 <span class="kw5">-quiet</span> ; `<br />
<span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw1">Write-host</span> <span class="st0">&quot;192.168.0.$_ <span class="es0">`t</span> UP&quot;</span> <span class="kw5">-ForegroundColor</span> Green<span class="br0">&#125;</span> `<br />
<span class="kw3">else</span> <span class="br0">&#123;</span><span class="kw1">Write-host</span> <span class="st0">&quot;192.168.0.$_ <span class="es0">`t</span> DOWN&quot;</span> <span class="kw5">-ForegroundColor</span> RED<span class="br0">&#125;</span><span class="br0">&#125;</span></div>
</div>
<p>В финале можно показать еще один способ - проверка результатов пинг-а с помощью WMI-класса <strong>win32_pingstatus</strong></p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="re0">$ip</span> <span class="sy0">=</span><span class="st0">&quot;192.168.100.81&quot;</span><br />
<span class="re0">$wq</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="st0">&#8216;select statuscode from win32_pingstatus where address=&quot;&#8217;</span> <span class="sy0">+</span> <span class="re0">$ip</span> <span class="sy0">+</span> <span class="st0">&#8216;&quot;&#8217;</span><span class="br0">&#41;</span><br />
<span class="re0">$res</span> <span class="sy0">=</span> <span class="kw2">gwmi</span> –query <span class="st0">&quot;$wq&quot;</span><br />
<span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$res</span>.StatusCode –eq 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">write-host</span> <span class="st0">&quot;UP&quot;</span><br />
<span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span><br />
<span class="kw1">write-host</span> <span class="st0">&quot;DOWN&quot;</span><br />
<span class="br0">&#125;</span><br />
<span class="re0">$res</span> <span class="sy0">=</span> $null</div>
</div>
<p>PS Вы еще не используете P<strong>owershell</strong>?<br />
А зря <img src='http://blog.wadmin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/07/powershell-ping/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Ключи для установки .NET Framework</title>
		<link>http://blog.wadmin.ru/2011/07/keys-for-net-framework/</link>
		<comments>http://blog.wadmin.ru/2011/07/keys-for-net-framework/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 06:58:37 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[setup]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3851</guid>
		<description><![CDATA[Набрел на полезную статью по ключам установки для всех версий .NET Framework. Представляю вам ее перевод. Хотя назвать его таковым довольно сложно&#8230; Автор рассказывает о том как можно автоматизировать установку, ремонт, удаление всех версий NET Framework и приводит [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3928" title="net" src="http://blog.wadmin.ru/wp-content/uploads/2011/07/net.jpg" alt="net" width="150" height="96" />Набрел на полезную <a href="http://blogs.msdn.com/b/astebner/archive/2009/04/16/9553804.aspx" rel="nofollow">статью</a> по ключам установки для всех версий .NET Framework. Представляю вам ее перевод. Хотя назвать его таковым довольно сложно&#8230;</p>
<p>Автор рассказывает о том как можно автоматизировать установку, ремонт, удаление всех версий NET Framework и приводит список ключей утановки, удаления или восстановления для каждой версии.</p>
<p>.NET Framework 1.0 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>dotnetfx.exe /q:a /c:&raquo;msiexec.exe /fpecmsu netfx.msi REBOOT=ReallySuppress /l*v %temp%\netfx10_repair_log.txt /qn&raquo;</p>
<p>Примечание &#8211; при восстановлении NET Framework 1.0 требуется повторная загрузка программы установки dotnetfx.exe и запуск командной строки с помощью этойустановки.</p></blockquote>
<p>.NET Framework 1.0 &#8211; автоматический ремонт</p>
<blockquote><p>dotnetfx.exe /q:a /c:&raquo;msiexec.exe /fpecmsu netfx.msi REBOOT=ReallySuppress /l*v %temp%\netfx10_repair_log.txt /qb&raquo;</p>
<p>Примечание &#8211; при восстановлении NET Framework 1.0 требуется повторная загрузка программы установки dotnetfx.exe и запуск командной строки с помощью этойустановки.</p></blockquote>
<p>.NET Framework 1.0 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>msiexec /x {B43357AA-3A6D-4D94-B56E-43C44D09E548} REBOOT=ReallySuppress /qn /l*v %temp%\netfx10_uninstall_log.txt</p>
<p>Обратите внимание что строка вызова процедуры изменяется в зависимости от того, что языковая версия NET Framework 1.0 у вас установлена. Код, указанный выше, соответствует английской версии. NET Framework 1.0, так что вам нужно будет использовать соответствующие отличных от английского код продукта, чтобы удалить не-английские версии. NET Framework 1.0.</p></blockquote>
<p>.NET Framework 1.0 &#8211; автоматическое удаление</p>
<blockquote><p>msiexec /x {B43357AA-3A6D-4D94-B56E-43C44D09E548} REBOOT=ReallySuppress /qb /l*v %temp%\netfx10_uninstall_log.txt</p>
<p>Обратите внимание что строка вызова процедуры изменяется в зависимости от того, что языковая версия NET Framework 1.0 у вас установлена. Код, указанный выше, соответствует английской версии. NET Framework 1.0, так что вам нужно будет использовать соответствующие отличных от английского код продукта, чтобы удалить не-английские версии. NET Framework 1.0.</p></blockquote>
<p>.NET Framework 1.1 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>dotnetfx.exe /q:a /c:&raquo;msiexec.exe /fpecmsu netfx.msi REBOOT=ReallySuppress /l*v %temp%\netfx11_repair_log.txt /qn&raquo;</p>
<p>Примечание &#8211; при восстановлении NET Framework 1.1 требуется повторная загрузка программы установки dotnetfx.exe и запуск командной строки с помощью этойустановки.</p></blockquote>
<p>.NET Framework 1.1 &#8211; автоматическое восстановление</p>
<blockquote><p>dotnetfx.exe /q:a /c:&raquo;msiexec.exe /fpecmsu netfx.msi REBOOT=ReallySuppress /l*v %temp%\netfx11_repair_log.txt /qb&raquo;</p>
<p>Примечание &#8211; при восстановлении NET Framework 1.1 требуется повторная загрузка программы установки dotnetfx.exe и запуск командной строки с помощью этойустановки.</p></blockquote>
<p>.NET Framework 1.1 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>msiexec /x {CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1} REBOOT=ReallySuppress /qn /l*v %temp%\netfx11_uninstall_log.txt</p></blockquote>
<p>.NET Framework 1.1 &#8211; автоматическое удаление</p>
<blockquote><p>msiexec /x {CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1} REBOOT=ReallySuppress /qb /l*v %temp%\netfx11_uninstall_log.txt</p></blockquote>
<p>.NET Framework 2.0 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v2.0.50727\install.exe /q</p></blockquote>
<p>.NET Framework 2.0 &#8211; автоматическое восстановление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v2.0.50727\install.exe /qb</p></blockquote>
<p>.NET Framework 2.0 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v2.0.50727\install.exe /u /q</p></blockquote>
<p>.NET Framework 2.0 &#8211; автоматическое удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v2.0.50727\install.exe /u /qb</p></blockquote>
<p>.NET Framework 2.0 SP1 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>msiexec /i {B508B3F1-A24A-32C0-B310-85786919EF28} REBOOT=ReallySuppress /l*v %temp%\netfx20sp1_repair_log.txt /qn</p></blockquote>
<p>.NET Framework 2.0 SP1 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>msiexec /x {B508B3F1-A24A-32C0-B310-85786919EF28} REBOOT=ReallySuppress /l*v %temp%\netfx20sp1_uninstall_log.txt /qn</p></blockquote>
<p>.NET Framework 2.0 SP2 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>msiexec /fpecmsu {C09FB3CD-3D0C-3F2D-899A-6A1D67F2073F} REBOOT=ReallySuppress REINSTALL=ALL /l*v %temp%\netfx20sp2_repair_log.txt /qn</p></blockquote>
<p>.NET Framework 2.0 SP2 &#8211; автоматическое восстановление</p>
<blockquote><p>msiexec /fpecmsu {C09FB3CD-3D0C-3F2D-899A-6A1D67F2073F} REBOOT=ReallySuppress REINSTALL=ALL /l*v %temp%\netfx20sp2_repair_log.txt /qb</p></blockquote>
<p>.NET Framework 2.0 SP2 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>msiexec /x {C09FB3CD-3D0C-3F2D-899A-6A1D67F2073F} REBOOT=ReallySuppress /l*v %temp%\netfx20sp2_uninstall_log.txt /qn</p></blockquote>
<p>.NET Framework 2.0 SP2 &#8211; автоматическое удаление</p>
<blockquote><p>msiexec /x {C09FB3CD-3D0C-3F2D-899A-6A1D67F2073F} REBOOT=ReallySuppress /l*v %temp%\netfx20sp2_uninstall_log.txt /qb</p></blockquote>
<p>.NET Framework 3.0 -&raquo;тихое&raquo; восстановление</p>
<blockquote><p>“%windir%\Microsoft.NET\Framework\v3.0\Microsoft .NET Framework 3.0\setup.exe” /q /f /norestart</p></blockquote>
<p>.NET Framework 3.0 &#8211; автоматическое восстановление</p>
<blockquote><p>“%windir%\Microsoft.NET\Framework\v3.0\Microsoft .NET Framework 3.0\setup.exe” /qb /f /norestart</p></blockquote>
<p>.NET Framework 3.0 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>“%windir%\Microsoft.NET\Framework\v3.0\Microsoft .NET Framework 3.0\setup.exe” /q /remove /norestart</p></blockquote>
<p>.NET Framework 3.0 &#8211; автоматическое удаление</p>
<blockquote><p>“%windir%\Microsoft.NET\Framework\v3.0\Microsoft .NET Framework 3.0\setup.exe” /qb /remove /norestart</p></blockquote>
<p>.NET Framework 3.0 SP1 &#8211; silent repair</p>
<blockquote><p>msiexec /i {2BA00471-0328-3743-93BD-FA813353A783} REBOOT=ReallySuppress /l*v %temp%\netfx30sp1_repair_log.txt /qn</p></blockquote>
<p>.NET Framework 3.0 SP1 &#8211; автоматическое восстановление</p>
<blockquote><p>msiexec /i {2BA00471-0328-3743-93BD-FA813353A783} REBOOT=ReallySuppress /l*v %temp%\netfx30sp1_repair_log.txt /qb</p></blockquote>
<p>.NET Framework 3.0 SP1 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>msiexec /x {2BA00471-0328-3743-93BD-FA813353A783} REBOOT=ReallySuppress /l*v %temp%\netfx30sp1_uninstall_log.txt /qn</p></blockquote>
<p>.NET Framework 3.0 SP1 &#8211; автоматическое удаление</p>
<blockquote><p>msiexec /x {2BA00471-0328-3743-93BD-FA813353A783} REBOOT=ReallySuppress /l*v %temp%\netfx30sp1_uninstall_log.txt /qb</p></blockquote>
<p>.NET Framework 3.0 SP2 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>msiexec /fpecmsu {A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7} REBOOT=ReallySuppress REINSTALL=ALL /l*v %temp%\netfx30sp2_repair_log.txt /qn</p></blockquote>
<p>.NET Framework 3.0 SP2 &#8211; автоматическое восстановление</p>
<blockquote><p>msiexec /fpecmsu {A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7} REBOOT=ReallySuppress REINSTALL=ALL /l*v %temp%\netfx30sp2_repair_log.txt /qb</p></blockquote>
<p>.NET Framework 3.0 SP2 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>msiexec /x {A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7} REBOOT=ReallySuppress /l*v %temp%\netfx30sp2_uninstall_log.txt /qn</p></blockquote>
<p>.NET Framework 3.0 SP2 &#8211; автоматическое удаление</p>
<blockquote><p>msiexec /x {A3051CD0-2F64-3813-A88D-B8DCCDE8F8C7} REBOOT=ReallySuppress /l*v %temp%\netfx30sp2_uninstall_log.txt /qb</p></blockquote>
<p>.NET Framework 3.5 - &raquo;тихое&raquo; восстановление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5\setup.exe&raquo; /q /norestart</p></blockquote>
<p>.NET Framework 3.5 &#8211; автоматическое восстановление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5\setup.exe&raquo; /qb /norestart</p></blockquote>
<p>.NET Framework 3.5 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5\setup.exe&raquo; /q /uninstall /norestart</p></blockquote>
<p>.NET Framework 3.5 &#8211; автоматическое удаление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5\setup.exe&raquo; /qb /uninstall /norestart</p></blockquote>
<p>.NET Framework 3.5 SP1 &#8211; &laquo;тихое&raquo; восстановление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5 SP1\setup.exe&raquo; /q /norestart</p></blockquote>
<p>.NET Framework 3.5 SP1 &#8211; автоматическое восстановление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5 SP1\setup.exe&raquo; /qb /norestart</p></blockquote>
<p>.NET Framework 3.5 SP1 &#8211; &laquo;тихое&raquo; удаление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5 SP1\setup.exe&raquo; /q /uninstall /norestart</p></blockquote>
<p>.NET Framework 3.5 SP1 &#8211; автоматическое удаление</p>
<blockquote><p>&laquo;%windir%\Microsoft.NET\Framework\v3.5\Microsoft .NET Framework 3.5 SP1\setup.exe&raquo; /qb /uninstall /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (32-bit) – silent repair</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (32-bit) – автоматическое восстановление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /passive/norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (32-bit) – &laquo;тихое&raquo; удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (32-bit) – автоматическое удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /passive /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (64-bit) – silent repair</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (64-bit) – автоматическое восстановление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /passive /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (64-bit) – &laquo;тихое&raquo; удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Client Profile (64-bit) – автоматическое удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /passive /norestart</p></blockquote>
<p>.NET Framework 4 Full (32-bit) – silent repair</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Full (32-bit) – автоматическое восстановление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /passive /norestart</p></blockquote>
<p>.NET Framework 4 Full (32-bit) – &laquo;тихое&raquo; удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Extended\setup.exe /uninstall /x86 /x64 /ia64 /parameterfolder Extended /q /norestart</p>
<p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Full (32-bit) – автоматическое удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Extended\setup.exe /uninstall /x86 /x64 /ia64 /parameterfolder Extended /passive /norestart</p>
<p>%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /passive /norestart</p></blockquote>
<p>.NET Framework 4 Full (64-bit) – silent repair</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Full (64-bit) – автоматическое восстановление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /passive /norestart</p></blockquote>
<p>.NET Framework 4 Full (64-bit) – &laquo;тихое&raquo; удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Extended\setup.exe /uninstall /x86 /x64 /ia64 /parameterfolder Extended /q /norestart</p>
<p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /q /norestart</p></blockquote>
<p>.NET Framework 4 Full (64-bit) – автоматическое удаление</p>
<blockquote><p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Extended\setup.exe /uninstall /x86 /x64 /ia64 /parameterfolder Extended /passive /norestart</p>
<p>%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /uninstall /x86 /x64 /parameterfolder Client /passive /norestart</p></blockquote>
<p><em><br />
</em></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/07/keys-for-net-framework/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Powershell &#8211; проверка статуса батареи ноутбука</title>
		<link>http://blog.wadmin.ru/2011/07/powershell-check-battery-status/</link>
		<comments>http://blog.wadmin.ru/2011/07/powershell-check-battery-status/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 08:39:01 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Powershell]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3914</guid>
		<description><![CDATA[Как всегда &#171;неожиданно&#187; нарисовалась задача по написанию некого скрипта который отрабатывал бы некоторый функционал при условии что он запускается только на стационарных компьютерах, в случае если &#171;под раздачу&#187; попадает ноутбук, скрипт должен выполняться только при [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3915" title="powershell" src="http://blog.wadmin.ru/wp-content/uploads/2011/07/powershell.png" alt="powershell" width="128" height="128" />Как всегда &laquo;неожиданно&raquo; нарисовалась задача по написанию некого скрипта который отрабатывал бы некоторый функционал при условии что он запускается только на стационарных компьютерах, в случае если &laquo;под раздачу&raquo; попадает ноутбук, скрипт должен выполняться только при условии что компьютер подключен к сети.</p>
<p>Как оказалось, реализовать данную задачу довольно просто. Нужно только заглянуть в WMI и приложить немного усилий для понимания того что там написано.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw1">Get-WmiObject</span> <span class="kw5">-Class</span> Win32_Battery</div>
</div>
<p>При запросе класса <strong>Win32_Battery,</strong> при условии наличия установленной батареи, на экран выводится вот такая &laquo;простыня&raquo;</p>
<pre>__GENUS                     : 2
__CLASS                     : Win32_Battery
__SUPERCLASS                : CIM_Battery
__DYNASTY                   : CIM_ManagedSystemElement
__RELPATH                   : Win32_Battery.DeviceID="15251 2010/06/15Hewlett-PackardPrimary"
__PROPERTY_COUNT            : 33
__DERIVATION                : {CIM_Battery, CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER                    : NOTEBOOK
__NAMESPACE                 : root\cimv2
__PATH                      : \\NOTEBOOK\root\cimv2:Win32_Battery.DeviceID="15251 2010/06/15Hewlett-PackardPrima
                              ry"
Availability                : 2
BatteryRechargeTime         :
BatteryStatus               : 2
Caption                     : Internal Battery
Chemistry                   : 2
ConfigManagerErrorCode      :
ConfigManagerUserConfig     :
CreationClassName           : Win32_Battery
Description                 : Internal Battery
DesignCapacity              :
DesignVoltage               : 12243
DeviceID                    : 15251 2010/06/15Hewlett-PackardPrimary
ErrorCleared                :
ErrorDescription            :
EstimatedChargeRemaining    : 97
EstimatedRunTime            : 71582788
ExpectedBatteryLife         :
ExpectedLife                :
FullChargeCapacity          :
InstallDate                 :
LastErrorCode               :
MaxRechargeTime             :
Name                        : Primary
PNPDeviceID                 :
PowerManagementCapabilities : {1}
PowerManagementSupported    : False
SmartBatteryVersion         :
Status                      : OK
StatusInfo                  :
SystemCreationClassName     : Win32_ComputerSystem
SystemName                  : NOTEBOOK
TimeOnBattery               :
TimeToFullCharge            :</pre>
<p>Что полезного можно отсюда получить:<br />
Режим работы батареи &#8211; <strong>BatteryStatus</strong> где 2 (от батареи) 3 (от сети)<br />
Уровень заряда &#8211; <strong>EstimatedChargeRemaining</strong> число в процентах</p>
<p>В случае если батарея не установлена то на экран ничего не выводится.</p>
<p>Вот решение моей задачи.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="co1"># запрашиваем нужный класс</span><br />
<span class="re0">$batt</span> <span class="sy0">=</span> <span class="kw1">Get-WmiObject</span> <span class="kw5">-Class</span> Win32_Battery<br />
<span class="co1"># проверяем наличие ответа</span><br />
<span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$batt</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="co1"># батарея есть. Это ноутбук.</span><br />
<span class="kw1">write-host</span> <span class="st0">&quot;battery Plugged In&quot;</span><br />
<span class="co1"># проверяем режим работы батареи</span><br />
<span class="kw3">if</span> <span class="br0">&#40;</span><span class="re0">$batt</span>.BatteryStatus <span class="kw4">-eq</span> 2<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw1">write-host</span> <span class="st0">&quot;battery Plugged In&quot;</span><br />
<span class="co1"># необходимый код</span><br />
<span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span><br />
<span class="co1"># устройство питается от батареи</span><br />
<span class="kw1">write-host</span> <span class="st0">&quot;battery not Plugged In&quot;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span> <span class="kw3">else</span> <span class="br0">&#123;</span><br />
<span class="co1"># это стационар</span><br />
<span class="kw1">write-host</span> <span class="st0">&quot;battery not found&quot;</span><br />
<span class="co1"># необходимый код</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>PS при желании можно ввести дополнительную проверку на уровень заряда. Мало ли возникнет вводная о том что нужно что то запускать если уровень заряда больше чем&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/07/powershell-check-battery-status/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>SCOM 2007 R2 – Пакетный перевод агентов в Maintenance Mode</title>
		<link>http://blog.wadmin.ru/2011/06/scom-2007-r2-packet-transfer-to-maintenance-mode/</link>
		<comments>http://blog.wadmin.ru/2011/06/scom-2007-r2-packet-transfer-to-maintenance-mode/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 07:51:21 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[SCOM 2007 R2]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3699</guid>
		<description><![CDATA[Типичная ситуация когда на группе серверов обновляется ПО довольно часто приводит к шквалу алертов отсылаемых по электронной почте и покраснению мониторов в консоли оператора. Даже если операторы поставлены в известность обязательно найдется кто то &#171;глухой&#187;&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3743" title="scom_2007_logo" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/scom_2007_logo.jpg" alt="scom_2007_logo" width="200" height="140" />Типичная ситуация когда на группе серверов обновляется ПО довольно часто приводит к шквалу алертов отсылаемых по электронной почте и покраснению мониторов в консоли оператора.</p>
<p>Даже если операторы поставлены в известность обязательно найдется кто то &laquo;глухой&raquo;&#8230;</p>
<p>Поэтому агентов необходимо перевести в режим обслуживания. Дело это через UI консоль может стать весьма хлопотным занятием. На помощь в таком случае как всегда приходит Operations Manager Shell.</p>
<p><strong>Задача:</strong></p>
<p>Перевести в режим обслуживание все сервера площадки имеющей индекс ХХХ с текущего момента сроком на 6 часов.</p>
<p><strong>Решение:</strong></p>
<p>Традиционная методику тыкать в UI консоли мышком мы отвергаем сразу и воспользуемся скриптом.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="re0">$StartTime</span> <span class="sy0">=</span> <span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span>::Now<br />
<span class="re0">$EndTime</span> <span class="sy0">=</span> <span class="re0">$StartTime</span>.AddHours<span class="br0">&#40;</span>6<span class="br0">&#41;</span><br />
<span class="re0">$Agents</span> <span class="sy0">=</span> Get<span class="sy0">-</span>Agent <span class="sy0">|</span> <span class="kw3">Where</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.Name –match <span class="st0">&quot;DC&quot;</span><span class="br0">&#125;</span><br />
<span class="re0">$Agents</span> <span class="sy0">|</span> <span class="kw3">foreach</span> <span class="br0">&#123;</span>New<span class="sy0">-</span>MaintenanceWindow <span class="sy0">-</span>StartTime <span class="re0">$StartTime</span> <span class="sy0">-</span>EndTime <span class="re0">$EndTime</span> <span class="sy0">-</span>reason <span class="st0">&quot;ApplicationInstallation&quot;</span> &nbsp;<span class="sy0">-</span>Comment <span class="st0">&quot;Planned update installation&quot;</span> <span class="sy0">-</span>MonitoringObject <a href="about:blank"><span class="kw6">$_</span></a>.HostComputer<span class="br0">&#125;</span></div>
</div>
<p>Здесь вместо функции AddHours() можно также использовать AddMinutes() или AddDays()</p>
<p>Развивая тематику режима обслуживания можно прикрутить &laquo;окна обслуживания&raquo; задекларированные в вашем SLA.</p>
<p>Внеочередное окно выделенное вам для серверов с именами DC-X1</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span> <span class="re0">$StartTime</span> <span class="sy0">=</span> <span class="st0">&quot;01/07/2011&quot;</span><br />
<span class="re0">$StartTime</span> <span class="sy0">=</span> <span class="re0">$StartTime</span>.ToUniversalTime<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span> <span class="re0">$EndTime</span> <span class="sy0">=</span> <span class="st0">&quot;02/07/2011&quot;</span><br />
<span class="re0">$EndTime</span> <span class="sy0">=</span> <span class="re0">$EndTime</span>.ToUniversalTime<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="re0">$Agents</span> &nbsp;<span class="sy0">=</span> Get<span class="sy0">-</span>Agent <span class="sy0">|</span> <span class="kw3">Where</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.Name –match <span class="st0">&quot;DC-X1&quot;</span><span class="br0">&#125;</span><br />
<span class="re0">$Agents</span> <span class="sy0">|</span> <span class="kw3">foreach</span> <span class="br0">&#123;</span>New<span class="sy0">-</span>MaintenanceWindow <span class="sy0">-</span>StartTime <span class="re0">$StartTime</span> <span class="sy0">-</span>EndTime <span class="re0">$EndTime</span> <span class="sy0">-</span>Reason <span class="st0">&quot;PlannedHardwareMaintenance&quot;</span> <span class="sy0">-</span>Comment <span class="st0">&quot;Hardware Maintenance&quot;</span> <span class="sy0">-</span>MonitoringObject <a href="about:blank"><span class="kw6">$_</span></a>.HostComputer<span class="br0">&#125;</span></div>
</div>
<p>Для планирования запуска скрипта (предположительно для планового обслуживания IIS-ов на серверах имеющих в шаблоне имени ключевую комбинацию &laquo;SPP&raquo; сроком от момента запуска на два часа) можно создать скрипт следующего содержания.</p>
<div class="codesnip-container" >
<div class="powershell codesnip" style="font-family:monospace;"><span class="kw1">Add-PSSnapin</span> Microsoft.EnterpriseManagement.OperationsManager.Client<br />
<span class="kw1">New-PSDrive</span> <span class="kw5">-Name</span>: Monitoring <span class="kw5">-PSProvider</span> OperationsManagerMonitoring <span class="kw5">-Root</span>: \<br />
<span class="kw2">cd</span> monitoring:\<br />
New<span class="sy0">-</span>ManagementGroupConnection GURON<br />
<span class="kw2">cd</span> GURON<br />
<span class="re0">$pf</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw2">gc</span> Env:\ProgramFiles<span class="br0">&#41;</span><br />
<span class="kw2">cd</span> <span class="st0">&quot;$pf\System Center Operations Manager 2007&quot;</span></p>
<p>.\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.Functions.ps1;<br />
Start<span class="sy0">-</span>OperationsManagerClientShell <span class="sy0">-</span>ManagementServerName: <span class="st0">&quot;&quot;</span> <span class="sy0">-</span>PersistConnection: <span class="re0">$true</span> <span class="sy0">-</span>Interactive: <span class="re0">$true</span>;</p>
<p><span class="re0">$iisAgents</span> <span class="sy0">=</span> get<span class="sy0">-</span>monitoringclass <span class="kw5">-name</span> <span class="st0">&quot;Microsoft.Windows.InternetInformationServices.2003.ServerRole&quot;</span><br />
<span class="re0">$iisInstance</span> <span class="sy0">=</span> Get<span class="sy0">-</span>MonitoringObject <span class="sy0">-</span>monitoringclass:<span class="re0">$iisAgents</span> <span class="sy0">|</span> <span class="kw3">where</span> <span class="br0">&#123;</span><a href="about:blank"><span class="kw6">$_</span></a>.PathName <span class="kw4">-match</span> <span class="st0">&#8216;SPP&#8217;</span><span class="br0">&#125;</span><br />
<span class="re0">$time</span> <span class="sy0">=</span> <span class="br0">&#91;</span>DateTime<span class="br0">&#93;</span>::Now</p>
<p>New<span class="sy0">-</span>MaintenanceWindow <span class="sy0">-</span>starttime: <span class="br0">&#40;</span><span class="re0">$time</span><span class="br0">&#41;</span> <span class="sy0">-</span>endTime: <span class="br0">&#40;</span><span class="re0">$time</span>.AddHours<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">-</span>reason <span class="st0">&quot;ApplicationInstallation&quot;</span> <span class="sy0">-</span>comment: <span class="st0">&quot;Skip all IIS Alerts&quot;</span> <span class="sy0">-</span>monitoringobject:$iisinstance</div>
</div>
<p>и поместить его в планировщике задач</p>
<pre>%SYSTEMROOT%\system32\WindowsPowerShell\v1.0\powershell.exe C:\Scripts\StartMaintenanceModeWindow.ps1</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/06/scom-2007-r2-packet-transfer-to-maintenance-mode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Оптимизация WordPress. Шаг 3</title>
		<link>http://blog.wadmin.ru/2011/06/wp-tuning-step-3/</link>
		<comments>http://blog.wadmin.ru/2011/06/wp-tuning-step-3/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 15:24:46 +0000</pubDate>
		<dc:creator>Сергей Мариничев</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.wadmin.ru/?p=3406</guid>
		<description><![CDATA[Следующим шагом для оптимизации WordPress будет приведение в порядок стилевых листов т.е. Оптимизация CSS. Этот тему я уже затрагивал с своей старой статье, но сегодня хочу вернуться к этому вопросу. Предыдущие заметки по вопросу оптимизации [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-3619" title="Оптимизация CSS" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/cssopt.jpg" alt="Оптимизация CSS" width="200" height="133" /> Следующим шагом для оптимизации WordPress будет приведение в порядок стилевых листов т.е. Оптимизация CSS. Этот тему я уже затрагивал с <a title="Оптимизация и сжатие CSS. Часть 1" href="http://blog.wadmin.ru/2011/01/compress-css-part-1/">своей старой статье</a>, но сегодня хочу вернуться к этому вопросу.</p>
<p>Предыдущие заметки по вопросу оптимизации вы можете найти по ссылкам:</p>
<li><a title="Оптимизация WordPress. Шаг 1" href="http://blog.wadmin.ru/2011/05/wp-tuning-step-1/">Оптимизация WordPress. Шаг 1</a></li>
<li><a title="Оптимизация WordPress. Шаг 2" href="http://blog.wadmin.ru/2011/05/wp-tuning-step-2/">Оптимизация WordPress. Шаг 2</a></li>
<p>Порядок действий:</p>
<ol>
<li>Создайте список имеющихся CSS-файлов.</li>
<li>По возможности объедините все эти листы в один. Это ускорит загрузку страниц.</li>
<li>Займитесь оптимизацией кода вручную или с помощью онлайн-инструментов.</li>
<li>Проверьте правильность кода и для уменьшения его размера и увеличению скорости загрузки сожмите его.</li>
</ol>
<p>Цель оптимизации CSS проста &#8211; борьба за каждый байт и уменьшение итогового размера CSS.</p>
<h3>Что в начале?</h3>
<p>Первое что приходит в голову &#8211; необходимо убрать точку с запятой (;) перед закрывающей скобкой (}). Эта мера несильно но уменьшит размер итогового файла.</p>
<div>
<ul>
<li>Сокращайте RGB–цвета у которых оттенки равны цвету.<br />
Например, в место #ffaa00 достаточно написать #fa0.</li>
<li>Сокращайте свойства.<br />
К примеру, вместо тяжелого&nbsp;</p>
<blockquote><p>.top-bar{<br />
border-syle: solid;<br />
border-color: blue;<br />
border-width: 1px;<br />
backround-color: #ffffff;<br />
backround-image: url(top-bar.gif);<br />
background-attachment: fixed;<br />
background-repeat: no-repeat;<br />
background-position: right bottom;<br />
}</p></blockquote>
<p>можно написать</p>
<blockquote><p>.top-bar{<br />
border: solid 1px blue;<br />
background: #fff url(top-bar.gif) fixed no-repead right bottom<br />
}</p></blockquote>
</li>
<li>Нулю единица измерения не нужна т.е. меняем все 0px на 0</li>
<li>Используйте сокращение числовых свойств:
<ul>
<li>.class{cвойство: 3px 4px 5px 6px} — все стороны разные<br />
(отсчет начинается с верху и идет по часовой стрелке (верх, право, низ, лево)).</li>
<li>.class{cвойство: 3px 0 5px} — связка лево–право имеют одно значение (ноль), а верх и низ разные.</li>
<li>.class{cвойство: 3px 5px} — связки верх–низ и лево–право.</li>
<li>.class{cвойство: 5px} — все стороны равны.</li>
</ul>
</li>
<li>Удаляйте лишние пробелы.</li>
</ul>
<p>Небольшой пример как браузеры интерпретируют обход свойств при сокращении записи.</p>
<p><img class="aligncenter size-full wp-image-3620" title="figureA" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/figureA.gif" alt="figureA" width="630" height="243" /></p>
<p>Теперь подробно рассмотрим правила сокращения.</p>
</div>
<h3>Правила сокращения для margin</h3>
<p>Свойство margin включает: <em>margin-top, margin-right, margin-bottom, margin-left.</em></p>
<p>Таким образом, вместо:</p>
<pre>box {
margin-top: 5px;
margin-right: 8px;
margin-bottom: 3px;
margin-left: 4px; }</pre>
<p>пишем:</p>
<pre>box { margin: 5px 8px 3px 4px; }</pre>
<p>Особо отмечу что сокращение правил всегда следуют в таком порядке: <em>top</em>, <em>right</em>, <em>bottom</em>, <em>left</em>. Чтобы легче запомнить, представьте, например, движение по часовой стрелке.</p>
<p>Если значения для <em>top/bottom</em> и <em>left/right</em> равны, сокращение приобретает следующий вид:</p>
<pre>box { margin: 5px 8px; }</pre>
<p>Т.е. получаем, что отступы сверху и снизу  8 px, а слева и справа отступы равны 5 px.</p>
<p>Приведу еще один способ:</p>
<pre>box {margin : 5px 10px 2px}</pre>
<p>в нем порядок обхода элементов следующий: 5px – верх, 10px – лево и право, 2px – низ</p>
<p>Если все четыре свойства имеют ожинаковое значение, то правило сокращения выглядит так:</p>
<pre>box { margin: 5px; }</pre>
<h3>Правила сокращения для padding</h3>
<p>Сокращенные правила для свойства <strong>padding</strong> абсолютно идентичны описанному выше для <strong>margin</strong>. Нужно лишь запомнить несколько правил:</p>
<ol>
<li>Порядок свойств: <strong>top, right, bottom, left</strong></li>
<li>Если правила можно сократить до двух значений, то свойства будут следовать в порядке:<strong>top/bottom</strong> и<strong> left/right</strong>.</li>
<li>Если нужно обнулить значения для нескольких сторон одновременно, то достаточно прописать<strong>0</strong> без указания единиц.</li>
</ol>
<p>Например в случае если у вас верх-низ равен 30 px, а лево-право равно 5 px пишем</p>
<pre>box { padding: 30px 5px }</pre>
<h3>Правила сокращения для border</h3>
<p>Свойство border имеет признаки - <em>border-width</em>, <em>border-style</em> и <em>border-color</em>. Первым следует значение width, затем style и color.</p>
<p>При использовании правил сокращения получается что вместо:</p>
<pre>box {
border-width: 1px;
border-style: dotted;
border-color: #c00; }</pre>
<p>можно написать:</p>
<pre>box { border: 1px dotted #c00; }</pre>
<h3>Правила сокращения для background</h3>
<p>Свойство background содержит 5 возможных значений: <em>background-color</em>, <em>background-image</em>, <em>background-repeat</em>, <em>background-attachment</em> и <em>background-position</em>.</p>
<p>При использовании правил сокращения получается что вместо:</p>
<pre>box {
background-color: #fff;
background-image: url(images/bg-top.gif);
background-repeat: repeat-y;
background-attachment: fixed;
background-position: top center; }</pre>
<p>Мы можем написать</p>
<pre>div { background: #fff url(images/bg-top.gif) repeat-y fixed top left; }</pre>
<p>Для свойства <strong>background-position</strong> первое значение относится к положению по вертикали, второе – по горизонтали. По умолчанию оба значения – center.</p>
<h3>Правила сокращения для list-style</h3>
<p>Свойство <strong>list-style</strong> включает: <em>list-style-position</em>, <em>list-style-type</em> (или <em>list-style-image</em>).</p>
<pre>ul {
list-style-type: square;
list-style-position: inside; }</pre>
<p>Мы можем написать</p>
<pre>ul { list-style: square inside; }</pre>
<p>Если нужно обнулить все значения стилей списков, то пишем:</p>
<pre>ul { list-style: none; }</pre>
<h3>Правила сокращения для font</h3>
<p>Использование сокращений для свойства <strong>font</strong>, скорее всего, наиболее актуально, т.к. включает множество свойств: <em>font-style</em>, <em>font-variant</em><strong>, </strong><em>font-weight</em>, <em>font-size</em>, <em>line-height</em> и <em>font-family</em>.</p>
<p>Вот примеры записей.</p>
<p><img class="aligncenter size-full wp-image-3621" title="figureB" src="http://blog.wadmin.ru/wp-content/uploads/2011/06/figureB.gif" alt="figureB" width="630" height="173" /></p>
<p>Изначально из вот такого кода:</p>
<pre>p {
font-style: italic;
font-variant: small-caps;
font-weight: bold;
font-size: small;
line-height: 1.6em;
font-family: Helvetica, Tahoma, sans-serif; }</pre>
<p>Мы можем получить вот такую довольно аккуратную строку.</p>
<pre>p { font: italic small-caps bold small/1.6em Helvetica, Tahome, sans-serif; }</pre>
<p>Естественно не требуется указывать все шесть значений&#8230;</p>
<p>Как правило мы используем значения font-size, line-height, font-family одновременно.</p>
<h3>Финальный шаг &#8211; валидация и сжатие</h3>
<p>Порой бывают настолько мелкие косяки и опечатки, что даже часовое копание в коде не приводит к результату. Для поиска ошибок и правильности полученного кода используйте <a rel="nofollow" href="http://jigsaw.w3.org/css-validator/">w3c валидатор</a>.</p>
<p>Для сжатия кода я предпочитаю использовать следующий онлайн-сервис <a rel="nofollow" href="http://cleancss.com" target="_blank">cleancss.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wadmin.ru/2011/06/wp-tuning-step-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

