<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Vadims Podans's blog - PowerShell | PowerShell V2</title>
    <link>http://www.sysadmins.lv/</link>
    <description>PowerShell powered</description>
    <image>
      <url>http://www.sysadmins.lv/images/imgusr/bilde.jpg</url>
      <title>Vadims Podans's blog - PowerShell | PowerShell V2</title>
      <link>http://www.sysadmins.lv/</link>
    </image>
    <language>en-us</language>
    <copyright>Vadims Podāns</copyright>
    <lastBuildDate>Tue, 27 Oct 2009 18:34:36 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>vpodans@sysadmins.lv</managingEditor>
    <webMaster>vpodans@sysadmins.lv</webMaster>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b3aacee7-8805-4fec-ad24-7f4c6826fec7</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b3aacee7-8805-4fec-ad24-7f4c6826fec7</wfw:commentRss>
      <title>PowerShell V2 RTM для Windows XP/Vista/2003/2008</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</link>
      <pubDate>Tue, 27 Oct 2009 18:34:36 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Слава &lt;strike&gt;сиськамПротоколу&lt;/strike&gt; Сноверу!&lt;/p&gt;  &lt;h1 align="center"&gt;&lt;font size="7"&gt;&lt;a href="http://support.microsoft.com/kb/968929" target="_blank"&gt;&amp;gt;&amp;gt; PowerShell V2 RTM &amp;lt;&amp;lt;&lt;/a&gt;&lt;/font&gt;&lt;/h1&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b3aacee7-8805-4fec-ad24-7f4c6826fec7"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b3aacee7-8805-4fec-ad24-7f4c6826fec7.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=8f153e17-466e-4777-bbd1-cab968f2b15e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=8f153e17-466e-4777-bbd1-cab968f2b15e</wfw:commentRss>
      <title>Get-TextEncoding</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</link>
      <pubDate>Sun, 04 Oct 2009 11:07:34 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;По мотивам предыдущего поста и срача в ньюсгруппе &lt;A href="http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.windows.powershell" target=_blank&gt;microsoft.public.windows.powershell&lt;/A&gt; перепубликовываю скрипт Роберта Робело для определения кодировки, в которой сохранён файл.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;filter&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-TextEncoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;requires -Version 2.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;begin&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_BigEndian&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;BigEndianUnicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
        [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; [&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;Text.Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;GetPreamble&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;()
    }
    &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;process&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-is&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;IO.FileInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Get-Content&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Literal&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.pspath &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Byte&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-Total&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;4&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-ErrorAction&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SilentlyContinue&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unicode&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UTF7&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.2&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]  &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UTF8&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.1&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_BigEndian&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BigEndian&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;elseif&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; (&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;[0.&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;.3&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;] &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-as&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;String&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #ff0000"&gt;-eq&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$BOM_UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;) {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UTF32&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; undetermined, no BOM&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;                &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; undetermined, zero bytes&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;            } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Unknown&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;'&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
            &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Add-Member&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;NoteProperty&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$value&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-PassThru&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;#&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt; not an IO.FileInfo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;
&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;        } &lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; {&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800080"&gt;$_&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}
    }
}&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;ну и использование достаточно простое:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;dir&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; *.ps1 | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0"&gt;Get-TextEncoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; | &lt;/SPAN&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;Format-Table&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; Name, &lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Encoding&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Уже тут видно мелкий косячок подсветки в PowerGUI. Name должно быть такого же цвета, что и Encoding. А выглядеть это будет примерно так:&lt;/P&gt;
&lt;DIV style="WIDTH: 915px"&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: #000040; FONT: 9pt consolas, lucida console"&gt;&lt;FONT color=#c0c0c0&gt;&lt;SPAN&gt;&lt;P&gt;&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans] dir desktop\*.ps1 | Get-TextEncoding | ft name, encoding

Name                                                        Encoding
----                                                        --------
Untitled1.ps1                                               BigEndian
untitled2.ps1                                               UTF8


&lt;FONT color=#ff0000&gt;[↓]&lt;/FONT&gt; [vPodans]&lt;/P&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;&lt;/DIV&gt;
&lt;P&gt;Не забудьте, что это будет работать только в V2. Для PowerShell 1.0 придётся чуточку подпилить его.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=8f153e17-466e-4777-bbd1-cab968f2b15e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,8f153e17-466e-4777-bbd1-cab968f2b15e.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=d8da596d-479d-4d4b-8601-113a8cd5c118</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=d8da596d-479d-4d4b-8601-113a8cd5c118</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>PS FCIV 1.0</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</link>
      <pubDate>Thu, 01 Oct 2009 19:12:11 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;После небольшого перерыва продолжаю допиливать свой вариант FCIV на PowerShell. И радостно могу сообщить, что уже есть версия 1.0, т.е. полностью отвечающая нашим требованиям. Что изменилось в новой версии?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Основная команда переименована с Get-PsFCIV в &lt;strong&gt;Start-PsFCIV&lt;/strong&gt;; &lt;/li&gt;    &lt;li&gt;Включена предварительная проверка файлов на блокировку; &lt;/li&gt;    &lt;li&gt;В связи с предыдущим пунктом, к&amp;#160; параметру &lt;strong&gt;Show&lt;/strong&gt; добавлен аргумент – &lt;strong&gt;Locked&lt;/strong&gt;. В это свойство помещаются заблокированные файлы (а для них нельзя подсчитать хеш); &lt;/li&gt;    &lt;li&gt;Включена проверка пути. Если путь к исходной папке не является путём файловой системы, то скрипт будет генерировать ошибку; &lt;/li&gt;    &lt;li&gt;Исправлена ошибка невозврата на исходный путь, если в процессе работы произошла фатальная ошибка; &lt;/li&gt;    &lt;li&gt;Параметр &lt;strong&gt;Show&lt;/strong&gt; теперь выводит файлы из указанных категорий в красивое графическое окошко с использованием &lt;strong&gt;Out-GridView&lt;/strong&gt;. Однако, следует учесть, что &lt;font color="#ff0000"&gt;использование Out-GridView требует, чтобы был установлен .NET Framework 3.5 SP1&lt;/font&gt;. &lt;/li&gt;    &lt;li&gt;Добавлен режим &lt;strong&gt;Quiet&lt;/strong&gt;, который ничего не выводит на экран, а только генерирует коды возврата (&lt;strong&gt;LastExitCode&lt;/strong&gt;). Коды возврата обновлены. &lt;/li&gt;    &lt;li&gt;Пофиксены сообщения режимов &lt;strong&gt;Verbose&lt;/strong&gt; и &lt;strong&gt;Debug&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Исправлены мелкие неточности в коде и произведена небольшая оптимизация кода. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;А теперь и on-line справка по всем параметрам по просьбе трудящихся.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Path&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — путь к папке, файлы которой следует посчитать или проверить. Допускаются относительные пути. Данный параметр обязателен. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;XML&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — путь к XML файлу, который содержит сведения о файлах. Если указанный файл не существует, то после пересчёта файлов по этому пути будет создан новый файл БД со сведениями о файлах. Параметр обязателен. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Include&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — опциональный параметр в котором вы можете указать только конкретный файл из папки. В таком случае будет проверена не вся папка, а только указанный файл. В настоящее время параметр не поддерживает подстановочные знаки (wildcard), типа '*.ext' из-за обеспечения поддержки файлов с метасимволами (например, в имени содержатся квадратные скобки). &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Action&lt;/strong&gt; &amp;lt;String&amp;gt;&lt;/font&gt; — опциональный параметр, который указывает на действие над файлами, у которых не совпадают хеши или сведения о дате изменения и размере файла. Может принимать значение &lt;strong&gt;Rename&lt;/strong&gt; или &lt;strong&gt;Delete&lt;/strong&gt;. В первом случае к проблемным файлам добавляется расширение .BAD, а во втором файл просто удаляется. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Show&lt;/strong&gt; &amp;lt;String[]&amp;gt;&lt;/font&gt; — опциональный параметр, в котором указываются категории файлов для дальнейшего анализа. В зависимости от результата проверки каждый файл (его имя) помещается в ту или иную категорию. &lt;font color="#ff0000"&gt;Требует установленного .Net Framework 3.5 SP1&lt;/font&gt;. Может принимать один или несколько аргументов из списка:       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;Bad&lt;/strong&gt; — содержит имена всех файлов, у которых обнаружен несовпадающий хеш или не совпадает дата/время изменеия и/или размер файла; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Locked&lt;/strong&gt; — в эту категорию помещаются файлы хеш которых проверить не удалось по причине блокировки файла в монопольном режиме каким-то приложением; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Missed&lt;/strong&gt; — содержит имена файлов, для которых есть запись в XML файле БД, но самого файла уже не существует (по любым причинам); &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; — в эту категорию попадают только имена новых файлов, для которых соответствующей записи ещё нет в XML файле. Новые файлы добавляются только в режиме Rebuild или когда файл БД создаётся с нуля. &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Ok&lt;/strong&gt; — сюда попадают файлы с успешным статусом проверки, т.е. хеш, дата/время изменения и размер файла совпадают со значениями в XML файле; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Total&lt;/strong&gt; — содержит имена всех обработанных файлов вне зависимости от результата проверки; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Unknown&lt;/strong&gt; — содержит имена файлов, для которых нельзя сопоставить хеш. Такая ситуация возможна, если в параметрах функции указан только хеш SHA1, но для файла в БД записан только MD5 хеш и наоборот. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Recurse&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — ключ, который включает проверку файлов не только в указанной папке, но и во всех вложенных папках. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Rebuild&lt;/strong&gt; &amp;lt;Swtich&amp;gt;&lt;/font&gt; — ключ, который задаёт особый режим работы скрипта — «освежение». Если этот ключ указан, то производится сверка файлов из БД с реальными файлами. Если файл более не существует, то соответствующая запись для него удаляется из БД. После чего целевая папка (и подпапки при указанном ключе –Recurse) проверяется на наличие новых файлов. Для каждого нового файла добавляется соответствующая запись в XML файл. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;SHA1&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — задаёт алгоритм хеширования, который будет использоваться для подсчёта новых файлов и/или для проверки уже существующих записей в XML файле. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;MD5&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — задаёт алгоритм хеширования, который будет использоваться для подсчёта новых файлов и/или для проверки уже существующих записей в XML файле. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Quiet&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает несопровождаемый режим работы скрипта. Если ключ указан, то итоговая статистическая информация не выводится на экран, а в зависимости от результата проверки генерируется код возврата (&lt;strong&gt;LastExitCode&lt;/strong&gt;). Код возврата может принимать одно из следующих значений:       &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; — в процессе работы скрипта все файлы были успешно проверены и их хеш, дата/время изменения и размер соответствуют записям в БД. Так же, данный код возврата будет сгенерирован, если создавался новый файл БД и все файлы были успешно в него добавлены; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; — в процессе проверки были обнаружены файлы с несовпадающим хешем и/или датой/временем и размером; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; — в процессе проверки было обнаружено, что для записи в БД нет соответствующего файла; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; — в процессе проверки были обнаружены файлы, для которых не удалось сопоставить алгоритм хеширования с хранимым в БД алгоритмом хеширования для файла. Такая ситуация возможна, если в параметрах функции указан только хеш SHA1, но для файла в БД записан только MD5 хеш и наоборот; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; — в процессе работы скрипта для некоторых файлов не удалось подсчитать хеш по причине блокировки файла в монопольном режиме другим приложением; &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; — скрипт выполнялся в режиме &lt;strong&gt;Rebuild&lt;/strong&gt; (освежения файла БД) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Verbose&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает отображение дополнительной информации о ходе проверки файлов. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;Debug&lt;/strong&gt; &amp;lt;Switch&amp;gt;&lt;/font&gt; — включает отображение отладочной информации о ходе работы скрипта. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Несколько примеров использования:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Show&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Bad, Missed&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет проверена папка &lt;strong&gt;C:\Files&lt;/strong&gt; и все вложенные папки. Файл &lt;strong&gt;db.xml&lt;/strong&gt; должен быть размещён непосредственно в этой папке. Если файл не существует, то будет создан с нуля. После проверки будет показано графическое окно с именами файлов, которые попали в категорию &lt;strong&gt;Bad&lt;/strong&gt; и &lt;strong&gt;Missed&lt;/strong&gt;. Для каждой категории будет отдельное графическое окно.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MD5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Include&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;data.dat&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет проверен только файл &lt;strong&gt;data.dat&lt;/strong&gt; в папке &lt;strong&gt;C:\Files&lt;/strong&gt; с использованием &lt;strong&gt;SHA1&lt;/strong&gt; алгоритмом хешиования. Если для файла в БД записан только &lt;strong&gt;MD5&lt;/strong&gt; хеш, то проверка будет произведена с использованием MD5. Если файл БД (db.xml) не существует, то создастся новый файл БД со сведениями о файле &lt;strong&gt;data.dat&lt;/strong&gt;. Файл будет подсчитан с использованием как SHA1, так и MD5.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-MD5&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Rebuild&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;будет произведено освежение файла БД для папки &lt;strong&gt;C:\Files&lt;/strong&gt;. Все записи, для которых соответствующего файла не обнаружено, будут удалены. Если в папке есть файлы, для которых нет соответствующей записи, то они будут обсчитаны с использованием алгоритмов SHA1 и MD5 и будут добвлены в XML файл. Файл &lt;strong&gt;db.xml&lt;/strong&gt; должен существовать, иначе скрипт вернёт фатальную ошибку.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #5f9ea0"&gt;Start-PsFCIV&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Files&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;db.xml&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Quiet&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Папка &lt;strong&gt;C:\Files&lt;/strong&gt; будет проверена в несопровождаемом режиме с использованием алгоритма SHA1. По умолчанию никакой информации на экране не будет. После окончания работы, в зависимости от результатов проверки, скрипт сгенерирует соответствующий код возврата (&lt;strong&gt;0-5&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;И, собственно, сам скрипт:&lt;/p&gt;

&lt;div&gt;
  &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file 
            &lt;br /&gt;38,3 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/PSFCIV_1.0.ps1" target="_self" alt="Download File"&gt;PSFCIV_1.0.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;И как обычно, любые замечания, комментарии постить в каменты.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=d8da596d-479d-4d4b-8601-113a8cd5c118"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,d8da596d-479d-4d4b-8601-113a8cd5c118.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b</wfw:commentRss>
      <title>PS FCIV (часть 3)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</link>
      <pubDate>Thu, 09 Jul 2009 21:43:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;И я снова вернулся. После последнего анализа кода была обнаружена серьёзная ошибка в коде, из-за которой пришлось его очень сильно переписывать. Поэтому я предлагаю оценить RC версию скрипта, который уже выполняет свою задачу, которая расписана в предыдущих статьях.&lt;/p&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; height: 66px; margin-left: auto; border-left-width: 0px; margin-right: auto" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt;&lt;span style="line-height: 1.25em; display: block; cursor: pointer; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;25,5 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.85.ps1" target="_self" alt="Download File"&gt;PSFCIV_0.85.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt; Итак, как с этим скриптом начинать работать. В скрипте есть 3 обязательных параметра: путь к папке, которую нужно посчитать или проверить, путь к XML файлу (если файла нету, то он будет создан) и как минимум 1 алгоритм хеширования. Т.е. минимум это должно выглядеть вот так:   &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;.\PSFCIV_0.85.ps1 C:\Temp –xml DB.XML –sha1&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;При этом можно указать алгоритм &lt;font color="#0000ff"&gt;–md5&lt;/font&gt; или оба сразу (&lt;font color="#0000ff"&gt;-sha1 –md5&lt;/font&gt;). В таком случае для каждого файла будет сгенерировано 2 хеша. Без указания любого из этих параметров будет сгенерирована ошибка и работа будет остановлена.&lt;/p&gt;  &lt;p&gt;Опциональные параметры:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Include&lt;/strong&gt; file.ext&lt;/font&gt; – будет произведена проверка только указанного файла; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Recurse&lt;/strong&gt;&lt;/font&gt; – будет произведена проверка всех файлов в папке и подпапках; &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Rebuild&lt;/strong&gt;&lt;/font&gt; – особый режим обновления XML файла, из которого будут удалены устаревшие записи и если есть новые файлы в папке или папках, то они будут добавлены в XML файл. Данный ключ требует наличия XML файла. Если файл БД не будет обнаружен, то будет выведена соответствующая ошибка. При этом режиме проверка целостности файлов не проверяется. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Verbose&lt;/strong&gt; brief/full&lt;/font&gt; – включает один из режимов вывода информации о ходе проверки на консоль. Можно выбрать Brief – упрощённый или Full – максимальный. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Show&lt;/strong&gt; Total/New/Ok/Bad/Miss&lt;/font&gt; – включает дополнительный режим вывода на экран одной из выбранных категорий. Например, всех проверенных файлов, только новых файлов, которые добавлены в БД, только файлов, которые прошли проверку, только файлы с несоответствующим хешем или только файлы, для которых есть запись в БД, но самого файла уже нету. &lt;/li&gt;    &lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;-Force&lt;/strong&gt; Rename/Delete&lt;/font&gt; – включает режим действия над проблемными файлами. Можно выбрать – переименования (тогда к файлу будет добавлено расширение &lt;strong&gt;.BAD&lt;/strong&gt;) или удаления файла. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;На данном этапе реализована работа в соответствии с логикой (которая описана тут: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,22a8186c-615b-41fa-8062-d74e1a2a28e0.aspx"&gt;PS FCIV (часть 1)&lt;/a&gt;) и односторонняя совместимость с FCIV. Т.е. этой утилите можно скармливать XML файл, который сгенерирован с помощью этого скрипта. В скрипте начата реализация поддержки альтернативных БД, которые не совместимы с FCIV XML. Плюс планируется обеспечение двусторонней поддержки FCIV – т.е. скрипт сможет корректно воспринимать и обрабатывать XML файлы, которые сгенерированы утилитой FCIV. Ну и оптимизация самого кода. Сам скрипт снабжён достаточно плотными комментариями, поэтому будет совсем нетрудно с ним разобраться. По мере дописывания кода буду выкладывать более актуальные версии файла.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update 27.07.2009&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Скрипт &lt;strong&gt;PsFCIV.ps1&lt;/strong&gt; переписан в виде &lt;em&gt;Advanced Function&lt;/em&gt; под именем &lt;strong&gt;Get-PsFCIV&lt;/strong&gt;. Теперь его достаточно загрузить в консоль используя &lt;em&gt;dot-sourcing&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Добавлена справка для функции. После загрузки функции в консоль достаточно набрать команду: &lt;strong&gt;Get-Help Get-PsFCIV&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;По умолчанию на экран не выводится никакой информации, а только коды возврата. Коды возврата описаны в справке. &lt;/li&gt;    &lt;li&gt;Изменён ключ &lt;strong&gt;-Verbose&lt;/strong&gt;. Теперь используется стандартный ключ &lt;strong&gt;-Verbose&lt;/strong&gt; для вывода расширенной информации. Аргументы не принмаются.&lt;/li&gt;    &lt;li&gt;Добавлен стандартный ключ &lt;strong&gt;-Debug&lt;/strong&gt; для вывода диагоностической информации. &lt;/li&gt;    &lt;li&gt;Добавлена поддержка обработки XML файла сгенерированного утилитой FCIV (т.е. совместимость с FCIV теперь двусторонняя). &lt;/li&gt;    &lt;li&gt;Ключ &lt;strong&gt;-Force&lt;/strong&gt; заменён на ключ &lt;strong&gt;-Action&lt;/strong&gt; с сохранением аргументов.&lt;/li&gt;    &lt;li&gt;К ключу &lt;strong&gt;-Show&lt;/strong&gt; добавлен ещё один аргумент &lt;strong&gt;Unknown&lt;/strong&gt; для индикации файлов с неопределённым результатом проверки. Такое состояние у файла может быть в случае, если не удалось сопоставить алгоритмы хеширования. Т.е. когда при вызове функции указывается алгоритм –SHA1, но в XML файле есть только MD5 хеш и наоборот.&lt;/li&gt; &lt;/ul&gt;  &lt;div&gt;   &lt;p style="border-bottom: silver 1px solid; position: relative; border-left: silver 1px solid; width: 240px; height: 66px; border-top: silver 1px solid; border-right: silver 1px solid"&gt;&lt;span style="font-family: verdana,arial,sans-serif; cursor: pointer"&gt;&lt;a style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;img style="border-right-width: 0px; width: 240px; border-top-width: 0px; border-bottom-width: 0px; height: 66px; border-left-width: 0px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/transparent.gif" /&gt; &lt;/a&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;img style="position: absolute; top: 6px; left: 5px" alt="Download File" src="http://www.sysadmins.lv/images/buttons/pgui.png" width="48" height="45" /&gt; &lt;/a&gt;&lt;a style="text-decoration: none" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self"&gt;&lt;span style="position: absolute; width: 167px; white-space: nowrap; color: #555555; overflow: hidden; top: 7px; margin-right: 5px; left: 67px"&gt;&lt;span style="display: block; visibility: hidden"&gt;1&lt;/span&gt; &lt;span style="line-height: 1.25em; display: block; cursor: pointer; text-decoration: none; padding-top: 1px" title="Download file"&gt;PS1 file              &lt;br /&gt;32,4 KB &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;a style="position: absolute; width: 167px; white-space: nowrap; color: #0066a7; overflow: hidden; top: 7px; margin-right: 5px; text-decoration: none; left: 67px" href="http://www.sysadmins.lv/content/scripts/psfciv_0.88.ps1" target="_self" alt="Download File"&gt;PSFCIV_0.88.ps1&lt;/a&gt; &lt;/span&gt;&lt;/p&gt; &lt;/div&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=c8006de1-3e00-4e4c-9782-3cfc9d0fb68b"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,c8006de1-3e00-4e4c-9782-3cfc9d0fb68b.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=29898a6c-aceb-4738-82d8-318bc89272cc</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=29898a6c-aceb-4738-82d8-318bc89272cc</wfw:commentRss>
      <title>PS FCIV (часть 2)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</link>
      <pubDate>Fri, 03 Jul 2009 20:26:05 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжаем повествование о процессе разработки функционального аналога FCIV.&lt;/p&gt;  &lt;h1 align="center"&gt;Подсчёт хешей и кодирование в Base64 String&lt;/h1&gt;  &lt;p&gt;Как я уже упоминал, самая первая и основная функциональная часть – функция подсчёта хешей. Я уже делал скрипт, который считает хеши: &lt;a href="http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!201.entry"&gt;Полезная безделушка Hash SHA1 на PowerShell&lt;/a&gt;, который и стал основой моего скрипта. Однако, по одной причине саму считалку пришлось обрезать. Если посмотреть справку по FCIV (&lt;a href="http://support.microsoft.com/kb/841290"&gt;http://support.microsoft.com/kb/841290&lt;/a&gt;), то он не записывает в БД реальный хеш файла, а пропускает его ещё через &lt;strong&gt;Base64&lt;/strong&gt; кодировку и закодированный хеш уже записывается в XML файл. В .NET уже есть стандартный кодировщик Base64, который на входе принимает массив байтов. Если посмотреть на указанный пост из моего блога, то там я приводил вывод объекта &lt;strong&gt;$hasher&lt;/strong&gt;, который как раз и является байтовым массивом, который мы потом преобразовывали в строку. Здесь же преобразовывать в строку ничего не нужно, а сразу подаём этот массив в конвертер. Вот как выглядит функция подсчёта хеша:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_hashbytes_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$type&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;sha1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Create&lt;/span&gt;&lt;span style="color: #000000"&gt;()}
        &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;md5&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;System.Security.Cryptography.MD5&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Create&lt;/span&gt;&lt;span style="color: #000000"&gt;()}
    }
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;System.IO.StreamReader&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$file&lt;/span&gt;&lt;span style="color: #000000"&gt;)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$hashBytes&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$hasher&lt;/span&gt;&lt;span style="color: #000000"&gt;.ComputeHash(&lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.BaseStream)
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$inputStream&lt;/span&gt;&lt;span style="color: #000000"&gt;.Close()
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$hashBytes&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;в качестве аргументов мы принимаем тип хеша – &lt;strong&gt;MD5&lt;/strong&gt; или &lt;strong&gt;SHA1&lt;/strong&gt; и сам файл:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] _hashbytes_ sha1 wsr.txt
7
11
122
247
126
249
232
24
193
38
194
124
237
202
26
183
178
64
173
45
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::ToBase64String($(_hashbytes_ sha1 wsr.txt))
Bwt693756BjBJsJ87coat7JArS0=
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::ToBase64String($(_hashbytes_ md5 wsr.txt))
kshzMfHPdtuXdL6l/vWwPA==
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;я подсчитал SHA1 хеш для текстового файла и на выходе получил такой же по структуре массив байтов, как и в предыдущей статье. И далее я этот массив подал в качестве аргумента для конвертера Base64 строки (статический метод &lt;a href="http://msdn.microsoft.com/en-us/library/dhx0d524.aspx" target="_blank"&gt;ToBase64String&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.aspx" target="_blank"&gt;System.Convert&lt;/a&gt;), а на выходе уже получил правильную Base64 строку. Именно эту строку FCIV записывает в файл. То же самое будем делать и мы. Кстати говоря. обратное преобразование делается через тот же класс&amp;#160; &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.aspx" target="_blank"&gt;System.Convert&lt;/a&gt;, но с использованием метода &lt;a href="http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx" target="_blank"&gt;FromBase64String&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [System.Convert]::FromBase64String(&amp;quot;Bwt693756BjBJsJ87coat7JArS0=&amp;quot;)
7
11
122
247
126
249
232
24
193
38
194
124
237
202
26
183
178
64
173
45
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] -join ([System.Convert]::FromBase64String(&amp;quot;Bwt693756BjBJsJ87coat7JArS0=&amp;quot;) | %{&amp;quot;{0:X2}&amp;quot; -f $_})
070B7AF77EF9E818C126C27CEDCA1AB7B240AD2D
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;как видите, массив байтов получился точно такой же. Второй строкой я показал, как можно собрать строку самого хеша, которую показывают различные программы подсчёта хешей. Как можно заметить все числа в массиве меньше, чем 256, т.е. не превышают значения 2&lt;sup&gt;8&lt;/sup&gt;, что является 1 байтом в двоичной форме. В цикле &lt;strong&gt;Foreach-Object&lt;/strong&gt; я преобразовываю каждый байт в &lt;strong&gt;HEX&lt;/strong&gt; и собираю в единую строку оператором &lt;strong&gt;–Join&lt;/strong&gt;, который доступен только в PowerShell V2. Но можно собрать и через &lt;strong&gt;[System.String]::Join()&lt;/strong&gt; для PowerShell 1.0.&lt;/p&gt;

&lt;h1 align="center"&gt;Генерация FCIV-совместимого XML файла&lt;/h1&gt;

&lt;p&gt;Если посмотреть в статью по FCIV, то увидим, что он использует свою нестандартную XML схему:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FCIV&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;wsr.txt&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;Bwt693756BjBJsJ87coat7JArS0=&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;-&lt;/font&gt; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt; 
      &lt;br /&gt;&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;0&lt;/strong&gt;&amp;lt;/&lt;font color="#804000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;strong&gt;xd/Rh0JyuW/I6sxPzY4sULyjS38=&lt;/strong&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/SHA1&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FILE_ENTRY&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt; 

    &lt;br /&gt;&amp;#160; &lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#804000"&gt;/FCIV&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;По этой причине мы лишаемся возможности использования &lt;strong&gt;Export-CliXML&lt;/strong&gt; и подобных команд, а нужно собирать вручную.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Внимание:&lt;/font&gt;&lt;/strong&gt; хоть FCIV и непривередлив к дополнительным полям в XML, но он начинает сильно ругаться, если поле Name написано с большой буквы. Его нужно заполнять так, как он есть в экземпляре, т.е. все маленькие буквы.&lt;/p&gt;

&lt;p&gt;Объект, который будет хранить все данные о файле будет вот такой:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #800080"&gt;$object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Т.е. мы в XML будем писать имя файла, его размер в байтах, время и дату последней модификации файла и хеши SHA1 и MD5. Если при создании БД мы будем использовать только один хеш, то второй будет просто пустым. Для сборки XML нам потребуется потребуется функция. Эту схему можно разложить на 3 составные части:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;заголовок XML и открывающийся тег &lt;strong&gt;&amp;lt;FCIV&amp;gt;&lt;/strong&gt;. Это присуствует только в начале XML файла и всё. Этот тег и заголовок больше нигде в XML не встречается. Поэтому header и открывающийся тег нужно поместить в скриптоблок &lt;strong&gt;Begin&lt;/strong&gt; функции.&lt;/li&gt;

  &lt;li&gt;А вот теги &lt;strong&gt;&amp;lt;FILE_ENTRY&amp;gt;&lt;/strong&gt; они повторяются для каждой записи. Следовательно этот тег будем заполнять в конструкции Process функции. Т.е. в каждой итерации &lt;strong&gt;Process&lt;/strong&gt; будет создаваться новый тег &lt;strong&gt;&amp;lt;FILE_ENTRY&amp;gt;&lt;/strong&gt;. Но внутри этого тега есть ещё вложенные теги, которые описывают наш файл. Чтобы решить эту задачу мы должны внутри конструкции &lt;strong&gt;Process&lt;/strong&gt; (которая по сути будет являться циклом) написать ещё один цикл, который будет разбирать входящий объект и данные из его свойств записывать во вложенные теги.&lt;/li&gt;

  &lt;li&gt;В конце XML файла будет закрывающийся тег &lt;strong&gt;&amp;lt;/FCIV&amp;gt;&lt;/strong&gt;, его будем помещать в скриптоблок End нашей функции.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt; Вот такая функция у меня получилась:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_toxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в Begin создаём заголовок XML и открывающийся тег &amp;lt;FCIV&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Begin&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;?xml version=`&amp;quot;1.0`&amp;quot; ?&amp;gt;`n &amp;lt;FCIV&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в Process будут по одному поступать объекты, которые описывают файл.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Process&lt;/span&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; для каждого файла у нас будет один тег &amp;lt;FILE_ENTRY&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;FILE_ENTRY&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы вручную не создавать и не заполнять вложенные теги мы простым foreach&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; перечисляем теги, какие у нас будут в XML и за счёт переменных автоматом&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; создаём их в XML и заполняем их данными. Для этого свойства объектов должны&lt;/span&gt;&lt;span style="color: #008000"&gt;
#&lt;/span&gt;&lt;span style="color: #008000"&gt; называться так же, как и теги.&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$child&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;name&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {
            &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;$child&amp;gt;$($_.$child)&amp;lt;/$child&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда текущий объект обработан, закрываем тег и ждём следующий объект файла&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt; &amp;lt;/FILE_ENTRY&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
&lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; когда объекты закончились, закрываем первый тег &amp;lt;FCIV&amp;gt; и подаём полученный XML дальше&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/FCIV&amp;gt;`n&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$xmlstring&lt;/span&gt;&lt;span style="color: #000000"&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;в ходе испытаний нарвался на одну засаду. В XML существуют некоторые символы как ‘&lt;strong&gt;&amp;amp;&lt;/strong&gt;’, ‘&lt;strong&gt;&amp;lt;&lt;/strong&gt;’, ‘&lt;strong&gt;&amp;gt;&lt;/strong&gt;’ и другие (полный список перечислен тут: &lt;a title="http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm" href="http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm"&gt;http://www.hdfgroup.org/HDF5/XML/xml_escape_chars.htm&lt;/a&gt;), которые нужно эксейпить, поскольку являются метасимволами в XML. Эти символы (в частности одинарная кавычка и амперсанд) могут присутствовать в имени файла. Погуляв по сайту MSDN нашёл выход. Выход заключается в использовании метода &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape.aspx" target="_blank"&gt;Escape&lt;/a&gt; класса &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securityelement.aspx" target="_blank"&gt;System.SecurityElement&lt;/a&gt;. Поэтому после того как массив объектов (которые описывают каждый файл) будет собран его нужно пропустить через фильтр и только после этого собирать XML вышеприведённой функцией. Вот как выглядит фильтр:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_escxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; {
    &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;Security.SecurityElement&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.name)
    &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Напоминаю, что мы должны эскейпить только свойство Name нашего объекта.&lt;/p&gt;

&lt;h1 align="center"&gt;Преобразование FCIV-совместимого XML в массив объектов&lt;/h1&gt;

&lt;p&gt;Вот мы уже научились правильно создавать XML файл, который будет полностью совместим со схемой, которая используется в самом FCIV. Теперь у нас возникает задача чтения этого XML и преобразования в массив объектов. Сначала я долго горевал, плакал и бился головой об стену, что нельзя использовать &lt;strong&gt;Import-CliXML&lt;/strong&gt;, но преобразование типов решило задачу ничуть не сложнее:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_fromxml_&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$xml&lt;/span&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;xml&lt;/span&gt;&lt;span style="color: #000000"&gt;]$(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gc&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-LiteralPath&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$xml&lt;/span&gt;&lt;span style="color: #000000"&gt;)).FCIV.FILE_ENTRY | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Size&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;TimeStamp&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;SHA1&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;MD5&lt;/span&gt;&lt;span style="color: #000000"&gt;}
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$sum&lt;/span&gt;&lt;span style="color: #000000"&gt;
}&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;сначала читаем файл и преобразовываем его в типа данных XML, опускаем теги &lt;strong&gt;FCIV&lt;/strong&gt; и &lt;strong&gt;FILE_ENTRY&lt;/strong&gt; и в цикле разбираем вложенные теги и собираем объект. Получилось достаточно просто. На сегодня, я думаю, что хватит, продолжение следует.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=29898a6c-aceb-4738-82d8-318bc89272cc"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,29898a6c-aceb-4738-82d8-318bc89272cc.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / FCIV</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=3e718992-80e2-458a-b2a6-ad293c46fe0c</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=3e718992-80e2-458a-b2a6-ad293c46fe0c</wfw:commentRss>
      <title>Scripting Games 2009 – Event5 (The 400-meter race)</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</link>
      <pubDate>Sun, 14 Jun 2009 10:16:39 GMT</pubDate>
      <description>&lt;div&gt;&lt;h1 align="center"&gt;Beginner Division&lt;/h1&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 30px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="Summer Scripting Games 2009" border="0" alt="Summer Scripting Games 2009" align="left" src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/ScriptingGames2009The400meterrace_14888/scripto_torchrunner_3.gif" width="150" height="167" /&gt; задача на работу с реестром.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Найти текущее значение максимального количества закачек в Internet Explorer &lt;/li&gt;    &lt;li&gt;Увеличить это число на другое значение &lt;/li&gt;    &lt;li&gt;при чтении этого значения предусмотреть проверку существования этого параметра &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ключи и значения реестра для этой задачи можно найти тут: &lt;a title="http://support.microsoft.com/kb/282402" href="http://support.microsoft.com/kb/282402"&gt;http://support.microsoft.com/kb/282402&lt;/a&gt;. В принципе, очень просто тут:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Test-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;)) {&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Item&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ItemType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Registry&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;}
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPer1_0Server) {
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPer1_0Server property doesn't exist&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    [&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPer1_0Server&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-PropertyType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;DWord&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPer1_0Server is: &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPer1_0Server}
&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPerServer) {
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Warning&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPerServer property doesn't exist&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    [&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Name&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPerServer&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Value&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-PropertyType&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;DWord&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
} &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;MaxConnectionsPerServer is: &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ItemProperty&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$path&lt;/span&gt;&lt;span style="color: #000000"&gt;).MaxConnectionsPerServer}&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и вот вывод:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Test-Path $path)) {New-Item -ItemType Registry -Path $path -Force}
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Get-ItemProperty $path).MaxConnectionsPer1_0Server) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPer1_0Server property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPer1_0Server' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPer1_0Server is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPer1_0Server}
&amp;gt;&amp;gt; if (!(Get-ItemProperty $path).MaxConnectionsPerServer) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPerServer property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPerServer' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPerServer is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPerServer}
&amp;gt;&amp;gt;
&lt;font color="#ffff00"&gt;WARNING: MaxConnectionsPer1_0Server property doesn't exist
WARNING: MaxConnectionsPerServer property doesn't exist&lt;/font&gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $path = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Test-Path $path)) {New-Item -ItemType Registry -Path $path -Force}
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] if (!(Get-ItemProperty $path).MaxConnectionsPer1_0Server) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPer1_0Server property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPer1_0Server' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPer1_0Server is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPer1_0Server}
&amp;gt;&amp;gt; if (!(Get-ItemProperty $path).MaxConnectionsPerServer) {
&amp;gt;&amp;gt;     Write-Warning &amp;quot;MaxConnectionsPerServer property doesn't exist&amp;quot;
&amp;gt;&amp;gt;     [void](New-ItemProperty -Path $path -Name 'MaxConnectionsPerServer' -Value 10 -PropertyType 'DWord')
&amp;gt;&amp;gt; } else {&amp;quot;MaxConnectionsPerServer is: &amp;quot; + (Get-ItemProperty $path).MaxConnectionsPerServer}
&amp;gt;&amp;gt;
MaxConnectionsPer1_0Server is: 10
MaxConnectionsPerServer is: 10
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;как бы ничего сложного.&lt;/p&gt;

&lt;h1 align="center"&gt;Advanced Division&lt;/h1&gt;

&lt;p&gt;работа с тэгами файлов. Потребуются файлы &lt;strong&gt;TechEd1.JPG&lt;/strong&gt;, &lt;strong&gt;TechEd2.JPG&lt;/strong&gt; и &lt;strong&gt;TechEd3.JPG&lt;/strong&gt; из Competitors Pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Задача:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;прочитать следующие EXIF свойства файлов: &lt;/li&gt;

  &lt;li&gt;Имя &lt;/li&gt;

  &lt;li&gt;когда снимок был сделан &lt;/li&gt;

  &lt;li&gt;свойство Make &lt;/li&gt;

  &lt;li&gt;и модель камеры, которой был сделан снимок &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Решение:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Задача не такая и сложная, на самом деле, как кажется. Для начала нам потребуется класс &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target="_blank"&gt;System.Drawing.Bitmap&lt;/a&gt; и его метод &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.image.getpropertyitem.aspx" target="_blank"&gt;GetPropertyItem&lt;/a&gt;. Для работы с этим классом нужно подключить библиотеку System.Drawing.dll:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;][&lt;/span&gt;&lt;span style="color: #008080"&gt;reflection.assembly&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;loadfile&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и создать объект &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target="_blank"&gt;System.Drawing.Bitmap&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.drawing.bitmap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ArgumentList&lt;/span&gt;&lt;span style="color: #000000"&gt; .\&lt;/span&gt;&lt;span style="color: #800000"&gt;TechEd1.jpg&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Этот объект будет содержать всё нам необходимое. Чтобы посмотреть нужные нам свойства, нужно получить где-то список всех ID, которым соответствуют эти свойства. К сожалению я не нашёл такого списка на MSDN, а только отдельными частями в интернете: 
  &lt;br /&gt;&lt;a title="http://www.exif.org/specifications.html" href="http://www.exif.org/specifications.html"&gt;http://www.exif.org/specifications.html&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;там в конце PDF файла есть Appendix с таблицой ID на эту тему. Если посмотреть в таблицу, то увидим, что Model находится под ID = 272. Глянем, что там есть:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing = New-Object system.drawing.bitmap -ArgumentList .\TechEd1.jpg
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing.GetPropertyItem(271).value
67
97
110
111
110
0
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Как-то не очень радует такой вывод. Но если внимательно посмотреть на эти цифры, то можно заметить, что они не превышают число 256, что подсказывает, что это массив &lt;strong&gt;ASCII&lt;/strong&gt; байтов. Эти ASCII байты можно сконвертировать в элемент вот так: &lt;strong&gt;[char]ASCII_Number&lt;/strong&gt;. А т.к. это массив, то его нужно собрать либо методом &lt;strong&gt;ToString()&lt;/strong&gt; или оператором &lt;strong&gt;–Join&lt;/strong&gt;, который есть в PowerShell V2:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing = New-Object system.drawing.bitmap -ArgumentList .\TechEd1.jpg
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] $drawing.GetPropertyItem(271).value
67
97
110
111
110
0
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] -join ($drawing.GetPropertyItem(271).value | %{[char]$_})
Canon
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Вот так оно всяко лучше стало. По такой же схеме выбираем и собираем все остальные свойства:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;][&lt;/span&gt;&lt;span style="color: #008080"&gt;reflection.assembly&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;loadfile&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;)
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; *.jpg | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;{
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;New-Object&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;system.drawing.bitmap&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-ArgumentList&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;Name&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Author&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Make&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;Model&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800000"&gt;DateTaken&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Name &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;.Name
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Author &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;315&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Make &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;271&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.Model &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;272&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;span style="color: #000000"&gt;.DateTaken &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-join&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$drawing&lt;/span&gt;&lt;span style="color: #000000"&gt;.&lt;/span&gt;&lt;span style="color: #8b4513"&gt;GetPropertyItem&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;36867&lt;/span&gt;&lt;span style="color: #000000"&gt;).&lt;/span&gt;&lt;span style="color: #8b4513"&gt;value&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{[&lt;/span&gt;&lt;span style="color: #008080"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;})
    &lt;/span&gt;&lt;span style="color: #800080"&gt;$photo&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;} | &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;ft&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AutoSize&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] [void][reflection.assembly]::loadfile(&amp;quot;C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll&amp;quot;)
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] dir *.jpg | %{
&amp;gt;&amp;gt;     $drawing = New-Object system.drawing.bitmap -ArgumentList $_
&amp;gt;&amp;gt;     $photo = &amp;quot;&amp;quot; | Select Name, Author, Make, Model, DateTaken
&amp;gt;&amp;gt;     $photo.Name = $_.Name
&amp;gt;&amp;gt;     $photo.Author = -join ($drawing.GetPropertyItem(315).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo.Make = -join ($drawing.GetPropertyItem(271).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo.Model = -join ($drawing.GetPropertyItem(272).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo.DateTaken = -join ($drawing.GetPropertyItem(36867).value | %{[char]$_})
&amp;gt;&amp;gt;     $photo
&amp;gt;&amp;gt; } | ft -AutoSize
&amp;gt;&amp;gt;

Name        Author     Make   Model               DateTaken
----        ------     ----   -----               ---------
TechEd1.JPG Ed Wilson  Canon  Canon PowerShot G9  2009:05:12 10:41:03
TechEd2.JPG Ed Wilson  Canon  Canon PowerShot G7  2009:05:12 10:25:59
TechEd3.JPG Ed Wilson  Sony   A-9                 2009:05:12 10:26:48


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Вобщем, как видите, тут тоже ничего сверхсложного нету.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=3e718992-80e2-458a-b2a6-ad293c46fe0c"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,3e718992-80e2-458a-b2a6-ad293c46fe0c.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
      <category>PowerShell / Scripting Games</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=b811f308-0c3f-4b29-b206-d09971185510</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=b811f308-0c3f-4b29-b206-d09971185510</wfw:commentRss>
      <title>Cmdlet wrapping и PsBoundParameters</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</link>
      <pubDate>Mon, 08 Jun 2009 21:41:52 GMT</pubDate>
      <description>&lt;div&gt;&lt;p align="justify"&gt;Работая с функциями в PowerShell можно столкнуться с одной особенностью – в качестве передачи аргументов в функции или скрипты вы можете использовать почти всё, кроме ключей (данных типа &lt;strong&gt;Switch&lt;/strong&gt;). Их передавать можно, но тут есть одна особенность. Обычно это ощущается, когда вы работаете с командлетами. Возьмём простой пример:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Path is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Filter is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Force is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;}&lt;/font&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;и вызовем эту функцию:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string[]]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; Write-Host '$Path is:' $Path
&amp;gt;&amp;gt; Write-Host '$Filter is:' $Filter
&amp;gt;&amp;gt; Write-Host '$Force is:' $Force
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -force
$Path is: C:\
$Filter is: *
$Force is: True
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;В принципе, всё как и ожидалось. Но если внимательно посмотреть на последний аргумент, то мы увидим лишь &lt;strong&gt;True&lt;/strong&gt;, т.е. увидим факт, что ключ &lt;strong&gt;Force&lt;/strong&gt; был передан. Однако, PowerShell не умеет подставять (биндить) переменную &lt;strong&gt;$Force&lt;/strong&gt; (равно как и другие переменные) как именованный параметр в другую команду. Чтобы в этом убедиться, мы попробуем сымитировать нашу функцию как командлет &lt;strong&gt;Get-ChildItem&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string[]]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; Get-ChildItem $Path $Filter $Force
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force
&lt;font color="#ff0000"&gt;Get-ChildItem : A positional parameter cannot be found that accepts argument 'True'.
At line:2 char:14
+ Get-ChildItem &amp;lt;&amp;lt;&amp;lt;&amp;lt;  $Path $Filter $Force
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand&lt;/font&gt;

&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Как видно, командлет Get-ChildItem не смог сопоставить последний аргумент ни с одним из своих параметров. Т.е. по факту выполнилась следующая строка:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;True&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;PowerShell не смог сказать командлету, что мы указали ключ &lt;strong&gt;Force&lt;/strong&gt; и хотим именно его передать в командлет. По факту в этом коде Get-ChildItem не знал, какие параметры ему были переданы и подставлял их на основе номера позиции параметра. А т.к. у Get-ChildItem нету параметра с порядковым номером 3 (с номером &lt;strong&gt;1&lt;/strong&gt; идёт &lt;strong&gt;Path&lt;/strong&gt; или &lt;strong&gt;LiteralPath&lt;/strong&gt;, а с номером &lt;strong&gt;2&lt;/strong&gt; идёт &lt;strong&gt;Filter&lt;/strong&gt;. Остальные параметры именованные), то мы получили ошибку. Но всё же, как выкручиваться из этой ситуации? Вы можете как угодно пытаться подставить аргументы, но ничего не выйдет. Для этих целей в PowerShell V2 появилась специальная переменная - &lt;strong&gt;$PSBoundParameters&lt;/strong&gt;. Эта переменная по сути представляет собой хэш-таблицу:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; $PSBoundParameters
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force

Key                                                         Value
---                                                         -----
Force                                                       True
Path                                                        C:\
Filter                                                      *


&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;В отличии от первого примера переменная &lt;strong&gt;$PSBoundParameters&lt;/strong&gt; содержит не только значения переменных, но и их имена (в перовм примере я вручную дописывал имена переменных), которые используются в качестве именованных параметров. Т.е. при подстановке аргументов в команду, она сначала выбирает имя переменной в качестве именованного параметра и значение переменной подставляет в качестве аргумента этого параметра. Синтаксис использования этой переменной очень прост:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#009500"&gt;function Name ($arg1, $arg2, $arg3 ... $argN) { 
      &lt;br /&gt;Command @PSBoundParameters 

      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;и в результате будет исполняться вот такая команда:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#009500"&gt;Command –arg1 &amp;lt;значение $arg1&amp;gt; –arg2 &amp;lt;значение $arg2&amp;gt; –arg3 &amp;lt;значение $arg3&amp;gt; … –argN &amp;lt;значение $argN&amp;gt;&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Т.е. будут подставляться именованные параметры и значения переменных соответствующих аргументов. Давайте проверим, как это подействует на наш пример с Get-ChildItem:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {
&lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color: #000000"&gt; @&lt;/span&gt;&lt;span style="color: #800000"&gt;PSBoundParameters&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt; Get-ChildItem @PSBoundParameters
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force


    Directory: C:\


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d--hs       10.07.2007.     19:44            $Recycle.Bin
d--hs       09.03.2008.     17:53            Boot
d----       23.11.2008.     19:41            inetpub
d-rh-       26.06.2007.     22:27            MSOCache
d----       09.03.2008.     17:41            PerfLogs
&amp;lt;...&amp;gt;&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;И вы можете видеть, что у нас всё получилось в наилучшем виде! В сравнении с предыдущим примером фактически выполнилась следующая команда:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Get-ChildItem&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;C:\&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Для формирования аргументов для командлетов в функциях (так называемые &lt;strong&gt;wrapped cmdlets&lt;/strong&gt;) это самый красивый и идеальный вариант. Если вы захотите изменить логику стандартных командлетов или добавить в них свой функционал, то &lt;strong&gt;$PSBoundParamters&lt;/strong&gt; сделает за вас очень много лишней работы. Но это не единственное полезное применение для этой переменной. Она так же позволяет сократить возможность ошибки при вызове функции внутри скрипта или другой функции, которая принимает те же аргументы. Давайте посмотрим ещё один пример:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {
    &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Path in Test is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Filter in Test is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Force in Test is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; ------------------------------&lt;/span&gt;&lt;span style="color: #800000"&gt;--&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Test2&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;, [&lt;/span&gt;&lt;span style="color: #008080"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #000000"&gt;) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Path in Test2 is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Filter in Test2 is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Write-Host&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #800000"&gt;$Force in Test2 is:&lt;/span&gt;&lt;span style="color: #800000"&gt;'&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Consolas"&gt;    }
    &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;&lt;font size="2" face="Consolas"&gt;Test2&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Consolas"&gt; @PSBoundParameters
}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Что мы делаем: мы создали функцию &lt;strong&gt;Test&lt;/strong&gt;, которая принимает набор аргументов. Внутри этой функции есть другая функция &lt;strong&gt;Test2&lt;/strong&gt;, которая принимает те же аргументы. Далее из функции &lt;strong&gt;Test&lt;/strong&gt; вызываем функцию &lt;strong&gt;Test2&lt;/strong&gt; и с помощью &lt;strong&gt;$PSBoundParameters&lt;/strong&gt; передаём в неё аргументы. &lt;u&gt;Обратите внимание, что в функции Test2 я изменил порядок аргументов&lt;/u&gt;. Это сделано для того, чтобы показать, что $PSBoundParamters отсортирует наши аргументы. А теперь внимание на экран:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre style="background-color: #000040; font: 9pt consolas, lucida console"&gt;&lt;font color="#c0c0c0"&gt;&lt;span&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] function Test ([string[]]$Path, [String]$Filter, [switch]$Force) {
&amp;gt;&amp;gt;     Write-Host '$Path in Test is:' $Path
&amp;gt;&amp;gt;     Write-Host '$Filter in Test is:' $Filter
&amp;gt;&amp;gt;     Write-Host '$Force in Test is:' $Force
&amp;gt;&amp;gt;     Write-Host --------------------------------
&amp;gt;&amp;gt;     function Test2 ([switch]$Force, [string[]]$Path, [String]$Filter) {
&amp;gt;&amp;gt;         Write-Host '$Path in Test2 is:' $Path
&amp;gt;&amp;gt;         Write-Host '$Filter in Test2 is:' $Filter
&amp;gt;&amp;gt;         Write-Host '$Force in Test2 is:' $Force
&amp;gt;&amp;gt;     }
&amp;gt;&amp;gt;     Test2 @PSBoundParameters
&amp;gt;&amp;gt; }
&amp;gt;&amp;gt;
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans] Test C:\ * -Force
$Path in Test is: C:\
$Filter in Test is: *
$Force in Test is: True
--------------------------------
$Path in Test2 is: C:\
$Filter in Test2 is: *
$Force in Test2 is: True
&lt;font color="#ff0000"&gt;[↓]&lt;/font&gt; [vPodans]&lt;/p&gt;&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;И смотрите, что у нас получилось. А у нас получилось, что функция Test2 получила тот же набор аргументов, причём они были подставлены в правильном соответствии. Фактически строка &lt;font color="#0000ff"&gt;Test2 @PSBoundParameters&lt;/font&gt; была преобразована в:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Consolas, lucida console"&gt;&lt;span style="color: #5f9ea0"&gt;Test2&lt;/span&gt;&lt;span style="color: #000000"&gt; -Path &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; -Filter &lt;/span&gt;&lt;span style="color: #800080"&gt;$Filter&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p align="justify"&gt;Т.е. в вариант, который мы вынуждены использовать в PowerShell 1.0. Плюс, мы имеем возможность подставлять позиционно ключи (объекты типа &lt;strong&gt;Switch&lt;/strong&gt;), что есть очень позитивно.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=b811f308-0c3f-4b29-b206-d09971185510"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,b811f308-0c3f-4b29-b206-d09971185510.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=5e247815-3494-4d33-8a09-98471bfef4a5</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=5e247815-3494-4d33-8a09-98471bfef4a5</wfw:commentRss>
      <title>Копирование файлов с графическим Progress Bar</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</link>
      <pubDate>Sat, 23 May 2009 23:23:37 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Навеяно множеством мотивов:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/9346bf70-c878-445a-8e55-08280f60a1ea" target="_blank"&gt;Копирование файла + GUI&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://zorion.wordpress.com/2009/05/12/090512/" target="_blank"&gt;Evernote и ещё что-нибудь&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://zorion.wordpress.com/2009/05/13/copy-data/" target="_blank"&gt;copy-data&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Как мне кажется, с Write-Progress вряд ли получится что-то хорошее, поэтому немного сориентировался и нашёл вот это: &lt;a href="http://halr9000.com/article/706" target="_blank"&gt;PowerShell Script: Copy-FilePlus&lt;/a&gt;. Именно этот скрипт взят за основу визуального окна. А за основу логики был взят мой простенький скрипт копирования файлов с сохранением структуры каталогов:&lt;a href="http://www.sysadmins.lv/PermaLink,guid,f216661c-be01-441b-927c-239352611bda.aspx"&gt;Лёгкая разминка&lt;/a&gt;. Приведённый по ссылке на &lt;strong&gt;Copy-FilePlus&lt;/strong&gt; вариант Хала Роттенберга является достаточно базовым, поскольку не позволяет копировать за раз множество файлов, плюс требуется вводить имя конечного файла. Я решил его немного расширить и добавить следующий функционал:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;при вызове функции достаточно указать конечную директорию, т.е. имя конечного файла вводить не надо&lt;/li&gt;    &lt;li&gt;поддержка массового копирования файлов как через конвейер, так и через передачу исходных файлов в аргументы&lt;/li&gt;    &lt;li&gt;поддержка копирования с сохранением дерева каталогов относительно определённой точки монтирования дерева&lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;заранее оговорюсь, что скрипт обладает одним недостатком: не будет единого прогресс-бара для всех файлов, а только для каждого файла свой (издержки .NET). Зато хоть что-то и весьма актуально при копировании больших файлов. Код получился несколько солидным, но я его постарался снабдить комментариями о коде и о логике, на которой он работает. Причём следуя примеру Роттенберга я скрипт тоже оформил в Advanced Function. По advanced functions я в скрипте вложил ссылки, как почитать о них во встроенной справке PowerShell. И, собственно, сам код:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt;#######################################################&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Copy files with GUI.ps1&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Version 1.3&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#
#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Copies single or couple files with GUI progressbar&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Original idea: Oisín Grehan&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; First edition: Hal Rottenberg&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Second edition: Vadims Podans&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#
#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Vadims Podans (c) 2009&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; &lt;a href="http://www.sysadmins.lv/"&gt;&lt;font color="#009500"&gt;http://www.sysadmins.lv/&lt;/font&gt;&lt;/a&gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt;#######################################################&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; сразу после названия идёт описание к функции. После загрузки функции в консоль&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; её справка будет доступна в консоли. Достаточно будет набрать:&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; Get-Help Copy-FilesPlus&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; вобщем, как в настоящих командлетах&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Copy-FilesPlus&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;lt;#&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;.Synopsis
    Copies files and folders displaying GUI progress bar.
.Description
    This is a script, that demonstrates how PowerShell can use
    useful .NET types and PowerShell V2 capabilities.
.Parameter Path
    Specifies the filename or FileInfo object representing file to be copied.
    Objects can be passed through a pipeline.
.Parameter Destination
    Specifies the path for resulting copy operation
.Parameter Recurse
    Gets the items in the specified locations and in all child items of the locations.
    Used only when source directory passed through argument list. 
.Parameter Force
    Creates directory structure in destination folder and copies files to
    their source respective folders (Tree copy).
.EXAMPLE
    PS &amp;gt; Copy-FilesPlus -Path C:\tmp -Destination e:\Users
    
    This will copy only files from C:\tmp to E:\Users
.EXAMPLE
    PS &amp;gt; Get-Item C:\tmp\windows7.iso | Copy-FilesPlus -Destination E:\Users
    
    This will copy specified file from C:\tmp folder to e:\Users
.EXAMPLE
    PS &amp;gt; Get-Childitem D:\Shared | Copy-FilesPlus -Destination E:\ 
    
    This will copy all files from Shared folders to E: drive root directory
.EXAMPLE
    PS &amp;gt; Get-Childitem D:\Shared -Recurse | Copy-FilesPlus -Destination E:\ -Force
    
    This will copy all files in Shared folder and subfolders. Shared folder will be a
    tree root point. All directory structure will be copied with files to destination folder.
.EXAMPLE
    PS &amp;gt; Copy-FilesPlus C:\Users\User E:\ -Recurse
    
    This will copy all files from User folder and subfolders to destination directory without
    copying source folders tree
.EXAMPLE
    PS &amp;gt; Copy-FilesPlus C:\Users\User E:\ -Recurse -Force
    
    This will copy all files in User folder and subfolders. User folder will be a
    tree root point. All directory structure will be copied with files to destination folder.
.ReturnValue
    Genrally, script don't return anything, except errors!
.Link
    about_functions
    about_functions_advanced
    about_functions_advanced_methods
    about_functions_advanced_parameters
#Requires -Version 2.0
&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt;#&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;

&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; ну и теперь фишки от advanced functions в V2. CmdletBinding делает&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; подстановку передаваемых аргументов в функцию. Если аргумент не передан&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;font size="2" face="Verdana"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;font size="2" face="Verdana"&gt; то PowerShell попросит его ввести, а не вывалится с ошибкой&lt;/font&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;[CmdletBinding()]
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;param&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; (
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; первый аргумент. Он является обязательным и он может принимать значения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; из конвейера. Причём, внутри блока Process {} для обозначения текущего элемента&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; можно использовать, как переменную $path, так и $_.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;span style="color: #000000"&gt;,ValueFromPipeline &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)]
        &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;,
        [Parameter(Mandatory &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;$true&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)]
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;,
        [&lt;/span&gt;&lt;span style="color: #008080"&gt;switch&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;    )
    &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;font size="2" face="Verdana"&gt;begin&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; пробуем создать папку назначения, куда будут копироваться файлы.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](md &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; вот тут я сделал переменную для счётчика. Счётчик мне потребуется для того,&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; чтобы при использовании ключа -Force и если файлы передаются по конвейеру&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; можно было брать точку начала дерева структуры, которая будет копироваться.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; временная функция, которая выполняет само копирование. Тут нужно учесть то,&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; что путь назначения должен указываться в полном формате с указанием имени&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; конечного файла. Относительные пути тут не поддерживаются. Поэтому дальше&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в коде я буду сохранять имя оригинального файла. т.е. переименовывание файлов&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; на лету не поддерживается&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; ([&lt;/span&gt;&lt;span style="color: #008080"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;process&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Add-Type&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-AssemblyName&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;microsoft.visualbasic&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                [Microsoft.VisualBasic.FileIO.FileSystem]::CopyFile(&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;, 
                [Microsoft.VisualBasic.FileIO.UIOption]::AllDialogs,
                [Microsoft.VisualBasic.FileIO.UICancelOption]::ThrowException)
            }
        }
    }
    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;process&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; вот здесь я проверяю, откуда пришли файлы - через аргументы или через конвейер&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если данные пришли из обоих путей, то приоритет за конвейером&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что объект существует и что это объект файловой системы&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName -ea &lt;/span&gt;&lt;span style="color: #800000"&gt;stop&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsProvider &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileSystem$&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если объект в порядке и выполняется только первая итерация конвейера&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; то мы задаём точку начала дерева. Весь путь от этой точки до имени файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; будет копироваться в папку назначения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-eq&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; здесь отрезаем от файла структуру папок, которая будет являться границей дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; $([&lt;/span&gt;&lt;span style="color: #008080"&gt;regex&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name))
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; заодно на основе этой структуры делаем регулярное выражение. Этим регулярным&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; выражением будем у всех последующих файлов отрезать начало и оставлять необходимую&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; часть дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;regex&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt;.Substring(&lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;,&lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt;.Length &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;))
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; важно, что эту операцию нужно проделать единожды, чтобы точка монтирования дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; больше не менялась в процессе. Поэтому увеличиваем счётчик и тогда в течении текущего&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; процесса копирования код сюда не вернётся&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$n&lt;/span&gt;&lt;span style="color: #ff0000"&gt;++&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                    }
                    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; проверяем, что нужно ли копировать дерево или нет.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если копируем дерево, то выбрасываем папки и работаем только с файлами&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.PsIsContainer}
                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если есть файлы для копирования, то выбираем весь путь папок до текущего файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и заранее приготовленным регэкспом отрезаем начало. В переменную $rep мы запишем&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; дерево папок от точки монтирования дерева до имени файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.Directory.ToString() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а теперь к папке назначения пристыковываем дерево папок от точки монтирования до имени файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; заранее создаём начальный хвостик папок в целевой папке и подавляем вывод на экран&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            [&lt;/span&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](md &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; а теперь к новому конечному пути пристыковываем имя файла&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и теперь подаём текущий файл в функцию копирования. Вот тут мы и увидим прогресс-бар.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                        }
                    } &lt;/font&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;font size="2" face="Verdana"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если структуру папок копировать не надо, то все файлы, что пришли с конвейера будут копироваться&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в папку назначения без создания структуры папок.&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.PsIsContainer) {
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                        }
                    }
                &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если объект не существует или это не объект файловой системы (защита от дураков, да-да :)), то ругаемся&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input object does not represent any applicable FileSystem object&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
            } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt; {
                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если данные об источнике копирования переданы через аргументы, то проверяем, что заданный путь допустим&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; и объект, который мы получим после Get-Item является объектом файловой системы&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;gi&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;span style="color: #000000"&gt; -ea &lt;/span&gt;&lt;span style="color: #800000"&gt;stop&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsProvider &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-match&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileSystem$&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$File&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если всё хорошо, то указанный файл или папка становятся точкой монтирования дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Resolve-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Path&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                    &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если ключи -Force -Recurse не указаны, то копируется либо указанный файл или все файлы в указанной&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; папке в папку назначения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsIsContainer} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; хитрый режим, когда рекурсивно выбираются все файлы в указанной папке и всех подпапках и копируются&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в папку назначения без сохранения структуры (т.е. в папке назначения будет большая куча файлов).&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;elseif&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-and&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsIsContainer} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; если указаны оба ключа, то мы повторяем структуру исходных папок относительно точки монтирования дерева&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; в папке назначения&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                    } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;elseif&lt;/span&gt;&lt;span style="color: #000000"&gt; (&lt;/span&gt;&lt;span style="color: #800080"&gt;$Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-and&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Force&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;) {
                        &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;dir&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="font-style: italic; color: #5f9ea0"&gt;-Recurse&lt;/span&gt;&lt;span style="color: #000000"&gt; | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;?&lt;/span&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;span style="color: #ff0000"&gt;!&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.PsIsContainer} | &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;%&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;{
                            &lt;/span&gt;&lt;span style="color: #008000"&gt;#&lt;/span&gt;&lt;span style="color: #008000"&gt; тут мы делаем то же самое, что и в случае, когда файлы пришли с конвейера&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #008000"&gt;
&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; [&lt;/span&gt;&lt;span style="color: #008080"&gt;regex&lt;/span&gt;&lt;span style="color: #000000"&gt;]::&lt;/span&gt;&lt;span style="color: #8b4513"&gt;Escape&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #800080"&gt;$RootPoint&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.Directory.ToString() &lt;/span&gt;&lt;span style="color: #ff0000"&gt;-replace&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$RootRegEx&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Destination&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$rep&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                            [&lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #008080"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;](md &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; -Force -ea &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;)
                            &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #5f9ea0; font-weight: bold"&gt;Join-Path&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$DestFolder&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;.Name
                            &lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;span style="color: #000000"&gt;.FullName | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;_routinecopy_&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;$Dest&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;
&lt;font size="2" face="Verdana"&gt;                        }
                    }
                } &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #800000"&gt;Input object does not represent any applicable FileSystem object&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;quot;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;span style="color: #000000"&gt;}
            }
        } &lt;/span&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;span style="color: #000000"&gt; {&lt;/span&gt;&lt;span style="color: #000080"&gt;$_&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: #000000"&gt;&lt;font size="2" face="Verdana"&gt;}
    }
}&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;font size="2" face="Verdana"&gt;Вот такой скриптик у меня получился. Местами даже очень умный, почти как я &lt;img alt=":)" src="/smilies/happy.gif"&gt;. Как мне кажется, на этом коде тоже можно чему-то поучиться. Если будут вопросы – то welcome в комментарии. &lt;img alt=":)" src="/smilies/happy.gif"&gt;&lt;/font&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=5e247815-3494-4d33-8a09-98471bfef4a5"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,5e247815-3494-4d33-8a09-98471bfef4a5.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=39a7b7e0-8474-4790-81b0-156b3964a8ac</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=39a7b7e0-8474-4790-81b0-156b3964a8ac</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>ConvertFrom-StringData</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</link>
      <pubDate>Tue, 10 Feb 2009 08:43:49 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Тут обнаружился один интересный командлет – &lt;STRONG&gt;ConvertFrom-StringData&lt;/STRONG&gt;, который позволяет преобразовывать строку в хэш-таблицы. Скажем, есть файл вида:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;ключ1 = значение1 &lt;BR&gt;ключ2 = значение2 &lt;BR&gt;ключ3 = значение3 &lt;BR&gt;ключ4 = значение4&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;при этом иногда очень хочется работать с этими строками как с объектами. Т.е. при указании объекта и его ключа, например, &lt;STRONG&gt;$a.key1&lt;/STRONG&gt; получить его значение. Как это делается в хэш-таблицах. Вот пример:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = @{"key1"="value1";"key2"="value2"}
[vPodans] $a

Name                           Value
----                           -----
key2                           value2
key1                           value1


[vPodans] $a.key1
value1
[vPodans] $a.key2
value2
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;здесь я создал простую хэш-таблицу. Но если у нас есть файл общего вида, &lt;STRONG&gt;ключ = значение&lt;/STRONG&gt;, то его можно легко привести в вид хэш-таблиц:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = "key1 = value1"
[vPodans] $a
key1 = value1
[vPodans] $a.GetType().FullName
System.String
[vPodans] $b = ConvertFrom-StringData -StringData $a
[vPodans] $b

Name                           Value
----                           -----
key1                           value1


[vPodans] $b.GetType().FullName
System.Collections.Hashtable
[vPodans] $b.key1
value1
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;сперва я создал строку, которая состоит из пары ключ = значение, в чём мы можем убедиться в типе данных. Вторым этапом я сконвертировал эту строку в хэш-таблицу. Однако, следует учесть, что такое возможно только для строки, но не массива строк. Вот так легко попасть в засаду:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = gc keys.txt
[vPodans] $a
key1 = value1
key2 = value2
key3 = value3
key4 = value4
[vPodans] $a[0]
key1 = value1
[vPodans] ConvertFrom-StringData -StringData $a
&lt;FONT color=#ff0000&gt;ConvertFrom-StringData : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'StringData
'. Specified method is not supported.
At line:1 char:35
+ ConvertFrom-StringData -StringData &amp;lt;&amp;lt;&amp;lt;&amp;lt;  $a
    + CategoryInfo          : InvalidArgument: (:) [ConvertFrom-StringData], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.ConvertFromStringDataCommand&lt;/FONT&gt;

[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;командлет &lt;STRONG&gt;Get-Content&lt;/STRONG&gt; (или его алиас &lt;STRONG&gt;GC&lt;/STRONG&gt;, не путать с глобальным каталогом) читает файл построчно в виде массива. Следовательно каждая строка является отдельным элементом массива. Как быть в такой ситуации? На первый взгляд может показаться, что можно Get-Content разобрать через &lt;STRONG&gt;Foreach-Object&lt;/STRONG&gt; и уже отдельные элементы массива подавать конвертеру в качестве строк. Смотрим:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = gc keys.txt | %{ConvertFrom-StringData -StringData $_}
[vPodans] $a

Name                           Value
----                           -----
key1                           value1
key2                           value2
key3                           value3
key4                           value4


[vPodans] $a.key1
[vPodans] $a.GetType().FullName
System.Object[]
[vPodans] $a[0].key1
value1
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Как видите, мы на выходе получили не одну хэш-таблицу, а массив одиночных хэш-таблиц и для доступа к его ключам и значениям нужно ещё указывать номер элемента в массиве. Чтобы решить данную проблему нужно каким-то образом прочитать файл не построчно, а в виде целой строки. Для чтения файла целиком можно воспользоваться методом &lt;A href="http://msdn.microsoft.com/en-us/library/system.io.file.readalltext.aspx" target=_blank&gt;ReadAllText&lt;/A&gt; класса &lt;A title="File Class" href="http://msdn.microsoft.com/en-us/library/system.io.file.aspx" target=_blank&gt;File Class&lt;/A&gt;. Как видно из описания метода, он читает текст в единую строку. Давайте посмотрим, что у нас получится:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN black? background-color: #009500?;&gt;&lt;P&gt;[vPodans] $a = [io.file]::ReadAllText("keys.txt")
[vPodans] $a
key1 = value1
key2 = value2
key3 = value3
key4 = value4


[vPodans] $a.GetType().FullName
System.String
[vPodans] $b = ConvertFrom-StringData -StringData $a
[vPodans] $b

Name                           Value
----                           -----
key2                           value2
key4                           value4
key1                           value1
key3                           value3


[vPodans] $b.key1
value1
[vPodans] $b.key2
value2
[vPodans] $b.key3
value3
[vPodans] $b.key4
value4
[vPodans]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;или просто в одну строчку:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;SPAN style="COLOR: #5f9ea0; FONT-WEIGHT: bold"&gt;ConvertFrom-StringData&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-STYLE: italic; COLOR: #5f9ea0"&gt;-StringData&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt; ([&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008080"&gt;io.file&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;]::&lt;/SPAN&gt;&lt;SPAN style="COLOR: #8b4513"&gt;ReadAllText&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;keys.txt&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;))&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Вот так просто в стиле The PowerShell Way (в одну строчку) можно текстовые файлы сконвертировать в хэш-таблицы и работать с ними как с объектами, что есть удобно и полезно.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=39a7b7e0-8474-4790-81b0-156b3964a8ac"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,39a7b7e0-8474-4790-81b0-156b3964a8ac.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=d56a1d9c-6474-4f4e-8a2b-9b16334ec503</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=d56a1d9c-6474-4f4e-8a2b-9b16334ec503</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - Active Directory/Workgroup</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</link>
      <pubDate>Mon, 05 Jan 2009 13:35:10 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Продолжая цикл постов о новых командлетах в PowerShell V2 CTP3 хочу рассказать про несколько командлетов для управлением компьютера как клиента в домене Active Directory или рабочей группе. Отмечу сразу, что эти командлеты не управляют доменом Active Directory, а только компьютером-клиентом домена (не знаю, как по-русски правильно сформулировать мысль). По сути эти командлеты повторяют аналог утилиты netdom.exe и вот их список:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Add-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Remove-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Rename-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Reset-ComputerMachinePassword&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Test-ComputerSecureChannel&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;и ещё 2 на закуску:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Restart-Computer&lt;/strong&gt;  &lt;li&gt;&lt;strong&gt;Stop-Computer&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Ну и как обычно - рассмотрим каждый из них:&lt;/p&gt; &lt;p&gt;1) &lt;strong&gt;Add-Computer&lt;/strong&gt; - добавляет компьютер к домену Active Directory или перемещает компьютер между рабочими группами (Workgroup). Данный командлет содержит следующие параметры и ключи:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-ComputerName&lt;/strong&gt; - параметр. Имя компьютера, который нужно включить в домен или рабочую группу. Можно указывать как NetBIOS имена, так и FQDN (Fully Qualified Domain Name) и IP адреса компьютеров. Для локального компьютера можно использовать точку ( &lt;strong&gt;.&lt;/strong&gt; ) или &lt;strong&gt;localhost&lt;/strong&gt; или не указывать этот параметр совсем, поскольку по умолчанию будет использовать именно локальная машина. Так же можно указывать несколько компьютеров перечисляя их через запятую. Имена можно передавать в командлет по конвейеру по свойству ComputerName.  &lt;li&gt;&lt;strong&gt;-Credential&lt;/strong&gt; - параметр. Учётные данные для аутентификации в домене или на удалённых компьютерах рабочей группы. Формат учётных данных такой же, как и в подключениях WMI. Для этого можно использовать командлет &lt;strong&gt;Get-Credential&lt;/strong&gt;. Данный параметр следует использовать только при необходимости использования альтернативных учётных данных. Если не указан, то будут использоваться учётные данные текущего пользователя.  &lt;li&gt;&lt;strong&gt;-DomainName&lt;/strong&gt; - параметр. DNS имя домена, куда будет подключаться компьютер. Этот параметр является обязательным при подключении к домену.  &lt;li&gt;&lt;strong&gt;-WorkgroupName&lt;/strong&gt; - параметр. Название рабочей группы, в которую перемещается компьютер. Обязателен при переводе компьютера из одной рабочей группы в другую.  &lt;li&gt;&lt;strong&gt;-OUPath&lt;/strong&gt; - параметр. Если заранее учётная запись компьютера заранее не создана в AD, то указание этого параметра позволяет добавить компьютер в нужный OU с созданием учётной записи в нём. Если этот параметр не указан, то компьютер будет помещён в контейнер по умолчанию - &lt;strong&gt;CN Computers&lt;/strong&gt;. Так же этот параметр не нужно указывать при перемещении компьютера между рабочими группами.  &lt;li&gt;&lt;strong&gt;-Server&lt;/strong&gt; - параметр. Используется только при подключении к домену. Позволяет выбирать контроллер домена, который будет производить ввод компьютера в домен и установку пароля компьютера в домене. Параметр опциональный и может иметь смысл при добавлении машин в домен в удалённых сайтах. Указывается в формате &lt;strong&gt;DomainName\DCName&lt;/strong&gt;.  &lt;li&gt;&lt;strong&gt;-Unsecure&lt;/strong&gt; - ключ. Операция по вводу компьютера в домен или рабочую группу будет производиться без установки защищённого канала между клиентом и сервером (контроллером домена). В домене с жёсткими политиками безопасности данный ключ может дать сбой.  &lt;li&gt;&lt;strong&gt;-Reboot&lt;/strong&gt; - ключ. Как известно любое изменение местоположения компьютера в сети (ввод в домен, вывод из домена, смена рабочей группы) требуют перезагрузки машины.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Примечание:&lt;/font&gt;&lt;/strong&gt; может показаться, что ключ &lt;strong&gt;-Reboot&lt;/strong&gt; очень полезный, но мне так не кажется. И вот почему. Если командлет сам не перезагружает машину после завершения операции, то это нужно сделать вручную. Но перезагружать машину можно только в случае если всё прошло успешно. Но если по каким-то причинам ожидаемый результат не был достигнут, то компьютер будет перезагружен в пустую. Я на этом не настаиваю, но мне это видится именно так.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;Hint:&lt;/font&gt;&lt;/strong&gt; не забывайте, что если указываются позиционные параметры, то их имена указывать не обязательно. Например, ComputerName позиционно является первым параметром и если указывать за командлетом сразу имена компьютеров, то название параметра -ComputerName можно и не указывать.&lt;/p&gt; &lt;p&gt;По умолчанию данный командлет не выводит результат на экран, поэтому для вывода результата исполнения можно использовать ключи &lt;strong&gt;-PassThru&lt;/strong&gt; или &lt;strong&gt;-Verbose&lt;/strong&gt;. Так же командлет имеет такие полезные ключи как &lt;strong&gt;-Confirm&lt;/strong&gt; для ручного подтверждения выполнения операции и &lt;strong&gt;-WhatIf&lt;/strong&gt; для моделирования работы командлета. И несколько примеров использования командлета:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Add-Computer -DomainName contoso.com -Credential (Get-Credential) -OUPath OU=Test,OU="3th floor",DC=Contoso,DC=com -Reboot&lt;br&gt;Add-Computer -ComputerName (Get-Content Comps.txt) -WorkgroupName MSHome -PassThru&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;2) &lt;strong&gt;Remove-Computer&lt;/strong&gt; - удаляет компьютер из домена или рабочей группы. Содержит параметры &lt;strong&gt;-ComputerName&lt;/strong&gt;, &lt;strong&gt;-Credential&lt;/strong&gt; (учётные данные пользователя, который имеет право на вывод машины из домена или локального администратора, если компьютер перемещается в рабочих группах), &lt;strong&gt;-Reboot&lt;/strong&gt;, &lt;strong&gt;-Confirm&lt;/strong&gt;, &lt;strong&gt;-PassThru&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;. Правила использования этих параметров и ключей такие же, что и для Add-Computer, но только в контексте удаления, а не ввода машины во что-то. Пример:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Remove-Computer -ComputerName computer1, computer2 -Credential contoso.com\Administrator -PassThru -Reboot&lt;font color="#000000"&gt; - выводит компьютер из домена. Следует учесть, что при выполнении команды будет запрошен пароль учётной записи, указанной в Credential.&lt;/font&gt;&lt;br&gt;Remove-Computer MyComputer&lt;/font&gt; - просто удаляет компьютер из рабочей группы (интересно, куда? &lt;img alt=":-D" src="/smilies/openmouth.gif"&gt; )&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;/font&gt; ни в коем случае не удаляйте так контроллеры домена. Их сначала нужно понизить до роли рядового сервера командой dcpromo и только потом с помощью UI, netdom или командлета Remove-Computer выводить из домена.&lt;/p&gt; &lt;p&gt;3) &lt;strong&gt;Rename-Computer&lt;/strong&gt; - переименовывает компьютер или компьютеры в рабочей группе или домене Active Directory. Обычно использует следующие параметры: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-ComputerName&lt;/strong&gt; - имя компьютера, которые нужно переименовать. Можно не указывать, если переименовывается локальный компьютер. Если компьютер находится в домене, то следует указывать его полное FQDN имя. Не поддерживает указание нескольких компьютеров, только одного.  &lt;li&gt;&lt;strong&gt;-NewComputerName&lt;/strong&gt; - новое имя компьютера. Если машина находится в домене, то переименовывается и её учётная запись.  &lt;li&gt;&lt;strong&gt;-Credential&lt;/strong&gt; - учётные данные. &lt;u&gt;&lt;font color="#ff0000"&gt;Данный параметр является обязательным при переименовании удалённых компьютеров-членов домена&lt;/font&gt;&lt;/u&gt; (кроме переименовывания локального компьютера).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;так же командлет содержит такие ключи как &lt;strong&gt;-Confirm&lt;/strong&gt;, &lt;strong&gt;-Reboot&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;/font&gt; ни в коем случае не пытайтесь этим командлетом переименовать контроллер домена!&lt;/p&gt; &lt;p&gt;4) &lt;strong&gt;Reset-ComputerMachinePassword&lt;/strong&gt; - сбрасывает пароль учётной записи компьютера в базе Active Directory. Используется только для доменных компьютеров. Данный командлет можно использовать при трудностях аутентификации компьютера в домене или при устаревании пароля. Несколько типичных случаев, когда требуется сброс пароля компьютера - компьютер не аутентифицировался в домене более 30 или 60 дней, в зависимости от настроек домена; компьютер был восстановлен из бэкапа (SystemState), срок которого старше 30 или 60 дней или компьютер был восстановлен из образа без дополнительного восстановления актуального SystemState и другие случаи.. Подробности этой темы выходят за рамки этого поста.&lt;/p&gt; &lt;p&gt;Из актуальных параметров содержит &lt;strong&gt;-ComputerName&lt;/strong&gt; (можно указывать несколько компьютеров. Допускаются FQDN, NetBIOS имена или IP адреса), &lt;strong&gt;-Server&lt;/strong&gt; - имя контроллера домена, который будет производить сброс пароля (не обязательный параметр) и &lt;strong&gt;-Credental&lt;/strong&gt; - имя пользователя, который имеет права сброса паролей указанных компьютеров. Из ключей можно выделить такие как &lt;strong&gt;-Confirm&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;. Общий синтаксис такой:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;Reset-ComputerMachinePassword (get-content comp.txt) &lt;/font&gt;- переустановит пароль всех компьютеров из списка comp.txt&lt;br&gt;&lt;font color="#0000ff"&gt;Reset-ComputerMachinePassword&lt;/font&gt; - переустановит пароль текущего компьютера&lt;br&gt;&lt;font color="#0000ff"&gt;Reset-ComputerMachinePassword -Server dc1.contoso.com -Credential (Get-Credential) -Confirm&lt;/font&gt; - переустановит пароль локального компьютера на контроллере домена с именем DC1 и с вводом альтернативных учётных записей. После запуска потребует подтверждения операции.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;5) &lt;strong&gt;Test-ComputerSecureChannel&lt;/strong&gt; - проверяет возможность установки безопасного канала между клиентом и сервером. Работает только в домене и возвращает &lt;strong&gt;True&lt;/strong&gt; или &lt;strong&gt;False&lt;/strong&gt;. Имеет один параметр и ключ:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-Server&lt;/strong&gt; - параметр. Имя компьютера в домене (допускается использовать FQDN, NetBIOS имена или IP адрес). Допускается указание только одного компьютера, с которым хотите проверить работоспособность безопасного канала. Параметр обязательный, поскольку нету смысла проверять защищённый канал с самим собой &lt;img alt=":)" src="/smilies/happy.gif"&gt;  &lt;li&gt;&lt;strong&gt;-Repair&lt;/strong&gt; - ключ. Если команда выводит False, то при указании этого ключа команда будет пытаться восстановить его.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;И содержит дополнительные ключи как -&lt;strong&gt;Confirm&lt;/strong&gt; и &lt;strong&gt;-WhatIf&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Я не придумал к какой категории присвоить эти 2 командлета и решил их описать здесь. Кстати, очень удобные командлеты:&lt;/p&gt; &lt;p&gt;6) &lt;strong&gt;Restart-Computer&lt;/strong&gt; и &lt;strong&gt;Stop-Computer&lt;/strong&gt;. Первый командлет перезагружает локальный или удалённый компьютер (или несколько), а второй выключает их совсем. Это очень полезно, поскольку я видел как минимум 5 различных решений перезагрузки/выключения компьютеров в скриптах PowerShell. Как правило это либо WMI, либо использование штатного shutdown.exe (кстати говоря, я им пользуюсь всегда) либо ещё что-нибудь. Теперь можно будет этот момент стандартизировать. Много говорить про них не буду, а скажу только, что эти командлеты используют метод &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394058(VS.85).aspx"&gt;Win32Shutdown&lt;/a&gt; WMI класса &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/aa394239.aspx"&gt;Win32_OperatingSystem&lt;/a&gt;. Следовательно эти командлеты обладают всеми новыми возможностями, которые описаны в предыдущей статье: &lt;a href="http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx"&gt;Обзор новых командлетов PowerShell V2 CTP3 - WMI&lt;/a&gt;. Одно из преимуществ - можно использовать фоновую работу. Скажем, отправить в ребут сотню компьютеров и пока это всё происходит спокойно работать в консоли (шутка &lt;img alt=":)" src="/smilies/happy.gif"&gt; ). Поэтому в этих командлетах можно использовать такие параметры и ключи как -AsJob, Impersonate, Authentication, ComputerName и другие. Из уникальных отмечу один параметр:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-ThrottleLimit&lt;/strong&gt; - указывает количество одновременных удалённых подключений для конкретно этой команды. Если компьютеров будет много в этой команде, то чтобы не загружать сеть можно ограничить, скажем, по 10-20 одновременных подключений. По умолчанию максимум одновременно установлено 32 подключения.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;и ключ:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;-Force&lt;/strong&gt; - без комментариев. Точнее перезагружает или выключает компьютер без спроса, форсирует закрытие всех приложений, что может быть риском потери данных, если они в этот момент не были сохранены.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;На сегодня вроде всё. Вроде ничего не пропустил.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=d56a1d9c-6474-4f4e-8a2b-9b16334ec503"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,d56a1d9c-6474-4f4e-8a2b-9b16334ec503.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=2a531ba4-0af2-47f7-9d17-e310eb527f2e</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=2a531ba4-0af2-47f7-9d17-e310eb527f2e</wfw:commentRss>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - WMI</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</link>
      <pubDate>Sun, 04 Jan 2009 18:37:15 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Windows Management Instrumentarion или просто WMI в PowerShell V2 так же претерпел изменения, а точнее дополнения по сравнению с версией 1.0. Я планирую более подробно описать новые и обновлённые параметры командлета &lt;strong&gt;Get-WMIObject&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;1) &lt;strong&gt;-List&lt;/strong&gt; - ключ. Позволяет получать список классов для системы или список свойств и методов для конкретного класса:&lt;/p&gt; &lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] Get-WmiObject -List


   NameSpace: ROOT\cimv2

Name                                Methods              Properties
----                                -------              ----------
__NotifyStatus                      {}                   {StatusCode}
__ExtendedStatus                    {}                   {Description, Operation, ParameterInfo, ProviderName...}
Win32_PrivilegesStatus              {}                   {Description, Operation, ParameterInfo, PrivilegesNotHeld...}
Win32_JobObjectStatus               {}                   {AdditionalDescription, Description, Operation, ParameterIn...
__SecurityRelatedClass              {}                   {}
__Trustee                           {}                   {Domain, Name, SID, SidLength...}
Win32_Trustee                       {}                   {Domain, Name, SID, SidLength...}
__NTLMUser9X                        {}                   {Authority, Flags, Mask, Name...}
....&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;По умолчанию, без указания других параметров, параметр &lt;strong&gt;-List&lt;/strong&gt; выводит список классов, которые расположены в контейнере по умолчанию &lt;strong&gt;Root\CimV2&lt;/strong&gt;. Но можно указывать и другие контейнеры при помощи параметра &lt;strong&gt;-NameSpace&lt;/strong&gt;. Например:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;Get-WmiObject -Namespace root\default -List&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Или для конкретного класса:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre style="background-color: black; font: 9pt courier new; color: #fff"&gt;&lt;font color="#009500"&gt;&lt;span black? background-color: #009500?;&gt;[vPodans] Get-WmiObject Win32_share -List | select * | fl


Name             : Win32_Share
__GENUS          : 1
__CLASS          : Win32_Share
__SUPERCLASS     : CIM_LogicalElement
__DYNASTY        : CIM_ManagedSystemElement
__RELPATH        : Win32_Share
__PROPERTY_COUNT : 10
__DERIVATION     : {CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER         : THOR
__NAMESPACE      : ROOT\cimv2
__PATH           : \\THOR\ROOT\cimv2:Win32_Share
Path             : \\THOR\ROOT\cimv2:Win32_Share
Derivation       : {CIM_LogicalElement, CIM_ManagedSystemElement}
Methods          : {Create, SetShareInfo, GetAccessMask, Delete}
Scope            : System.Management.ManagementScope
Options          : System.Management.ObjectGetOptions
ClassPath        : \\THOR\ROOT\cimv2:Win32_Share
Properties       : {AccessMask, AllowMaximum, Caption, Description...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers       : {CreateBy, DeleteBy, dynamic, Locale...}
Site             :
Container        :



[vPodans]&lt;/span&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;здесь мы видим доступные методы (Create, SetShareInfo и другие), а так же свойства объекта класса (AccessMask, AllowMaximum, Caption и другие). Можно и более подробно посмотреть методы или свойства объекта:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;Get-WmiObject Win32_share -List | %{$_.methods}&lt;/font&gt; - получение подробных сведений о методах объекта класса&lt;br&gt;&lt;font color="#0000ff"&gt;Get-WmiObject Win32_share -List | %{$_.properties}&lt;/font&gt; - получение подробных сведений о свойствах объекта класаа&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Кстати говоря, в PowerShell 1.0 параметр &lt;strong&gt;-List&lt;/strong&gt; не работал для конкретных классов, а только для перечисления самих классов. Т.е. приведённые выше 2 команды в 1.0 не работают. Теперь этот недостаток исправлен.&lt;/p&gt;
&lt;p&gt;2) &lt;strong&gt;-AsJob&lt;/strong&gt; - ключ. Позволяет выполнять команду в фоновом режиме. Это новая возможность в PowerShell V2, которая позволяет запускать некоторые команды в фоновом режиме не блокируя при этом саму консоль. Коллега, &lt;a target="_blank" href="http://xaegr.wordpress.com/"&gt;Вася Гусев&lt;/a&gt;, уже делал скринкаст по фоновым работам в PowerShell (и не только о них) на &lt;a target="_blank" href="http://www.techdays.ru/Lecture.aspx?LID=28c60ac7-f774-45ca-9ff9-2f774d2fd70b"&gt;TechDays.ru&lt;/a&gt; (потребуется авторизация с помощью LiveID или OpenID). И я так же планирую обсудить в своём блоге этот вопрос в обозримом будущем.&lt;/p&gt;
&lt;p&gt;3) &lt;strong&gt;-Authentication&lt;/strong&gt; - параметр. Позволяет задавать уровень аутентификации к удалённой машине. Возможные уровни аутентификации могут быть:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;-1&lt;/strong&gt; &lt;em&gt;(Unchanged)&lt;/em&gt; - я не смог найти описание этому уровню, но он в Windows XP/Windows Server 2003 используется для локальных подключений на себя. 
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; &lt;em&gt;(Default)&lt;/em&gt; - необходимый уровень будет согласовываться между сервером и клиентом в зависимости от настроек Windows Authentication. 
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; &lt;em&gt;(None)&lt;/em&gt; - не использует аутентификацию. Все уровни безопасности будут проигнорированы. Не следует использовать этот уровень, поскольку с ним аутентифицироваться не удастся (разве что в случае разрешённых анонимных подключений на сервере).
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; &lt;em&gt;(Connect)&lt;/em&gt; - клиент аутентифицируется только при установке подключения. После установки подключения аутентификационные данные не проверяются. 
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; &lt;em&gt;(Call)&lt;/em&gt; - пересылаемые учётные данные проверяются при каждом запросе клиента. Учётные данные криптографически подписываются, но не шифруются. Пересылаемые данные во время сессии не подписываются и не шифруются. Гарантируется, что во время пересылки аутентификационных данных они не были никоим образом изменены.
&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; &lt;em&gt;(Packet)&lt;/em&gt; - похож на уровень &lt;strong&gt;Call&lt;/strong&gt; с учётом того, что сервер проверяет что данные пришли от ожидаемого клиента. Так же учётные данные подписываются и не шифруются. Данные не подписываются и не шифруются (используется по умолчанию при сетевых подключениях). 
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; &lt;em&gt;(PacketIntegrity)&lt;/em&gt; - подписываются как учётные данные, так и сами пересылаемые данные. Данный уровень гарантирует, что с момента отправки от клиента до получения данных сервером любые данные не были изменены. Но данные (в том числе учётные) по прежнему не шифруются. 
&lt;li&gt;&lt;strong&gt;6&lt;/strong&gt; &lt;em&gt;(PacketPrivacy)&lt;/em&gt; - все передаваемые данные между клиентом и сервером подписываются и шифруются.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;В версии 1.0 можно было изменять уровни аутентификации, но там были свои сложности. Например, при первом подключении нельзя было указывать свой уровень аутентификации, а только при последующих обращениях к серверу. Например так:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$a = Get-WmiObject Win32_share -filter "Name = 'sharename'"&lt;br&gt;$a.PSBase.Scope.Options.Authentication = 6&lt;/font&gt;&lt;font color="#000000"&gt; или &lt;/font&gt;&lt;font color="#0000ff"&gt;PacketPrivacy&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;4) &lt;strong&gt;-Authority&lt;/strong&gt; - параметр. Позволяет клиенту выбирать, кто будет его аутентифицировать (например, LSA удалённой машины или сервер Active Directory) при указании параметра &lt;strong&gt;-Credentials&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;5) &lt;strong&gt;-DirectRead&lt;/strong&gt; - ключ. Если указывается, то производится прямой доступ к классу без привязки к нему более высших или производных классов. Реальной пользы я тут пока что не вижу.&lt;/p&gt;
&lt;p&gt;6) &lt;strong&gt;-Impersonation&lt;/strong&gt; - параметр. В этом параметре можно указывать уровень имперсонализации при удалённых подключениях. Может иметь следующие значения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; &lt;em&gt;(Default)&lt;/em&gt; - так же не смог найти описания для него. Во всяком случае в самом WMI такой уровень нигде не определён и скорее всего это какой-то производный уровень из нескольких внутри самого PowerShell. 
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; &lt;em&gt;(Anonymous)&lt;/em&gt; - При указании этого уровня учётные данные клиента скрываются. По факту WMI в современных версиях ОС скорее всего не поддерживает этот уровень, а переводит его в уровень &lt;strong&gt;Identify&lt;/strong&gt; и использует его для имперсонализации клиента. В Windows 2000 было так, во всяком случае. Да и особого смысла в нём нету, поскольку с таким уровнем ничего сделать не удастся в общем смысле. 
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; &lt;em&gt;(Identify)&lt;/em&gt; - позволяет объектам запрашивать учётные данные вызывающего пользователя, но не использовать их. Следовательно удалённый объект не сможет установить вас в контексте безопасности (т.е. подтвердить, что вы именно тот за кого себя выдаёте). С таким уровнем обычно можно только прочитать ACL списки объектов (и то не всегда), но не более. 
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; &lt;em&gt;(Impersonate)&lt;/em&gt; - позволяет объектам использовать учётные данные вызывающего пользователя. Это в свою очередь позволяет пользователю использовать свои учётные данные для произведения любых операций над объектами в пределах прав пользователя на этот объект (обычно эти права задаются ACL списками). Данный уровень используется в PowerShell по умолчанию. Поэтому для использования уровня &lt;strong&gt;Impersonate&lt;/strong&gt; данный параметр указывать не обязательно. 
&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; &lt;em&gt;(Delegate)&lt;/em&gt; - это уровень транзитивной делегации учётных данных. Это позволяет удалённым объектам передавать ваши учётные данные другим объектам на других машинах. Иными словами, когда пользователь с машины &lt;strong&gt;A&lt;/strong&gt; подключается к машине &lt;strong&gt;B&lt;/strong&gt;, то в этом случае используется уровень &lt;strong&gt;Impersonate&lt;/strong&gt; между &lt;strong&gt;A&lt;/strong&gt; и &lt;strong&gt;B&lt;/strong&gt;. Но если для завершения операции объекту с машины &lt;strong&gt;B&lt;/strong&gt; нужно получить ещё объект с машины &lt;strong&gt;C&lt;/strong&gt;, то &lt;strong&gt;Delegate&lt;/strong&gt; позволит машине &lt;strong&gt;B&lt;/strong&gt; аутентифицироваться на машине &lt;strong&gt;C&lt;/strong&gt; с учётными данными, которые были получены от машины &lt;strong&gt;A&lt;/strong&gt;. Если совсем грубо, то пользователь просто разрешает запрашиваемым объектам использовать его учётные записи для своих нужд. Безусловно, это большой риск, когда объект может распоряжаться полученными учётными данными как хочет, поэтому все пользователи и компьютеры, которые будут участвовать в транзакции (например, пользователь и компьютеры &lt;strong&gt;A&lt;/strong&gt;, &lt;strong&gt;B&lt;/strong&gt; и &lt;strong&gt;C&lt;/strong&gt;) должны быть помечены как &lt;strong&gt;Trusted For Delegation&lt;/strong&gt; в &lt;strong&gt;Active Directory&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;В версии 1.0 так же можно было изменять уровень имперсонализации с теми же сложностями, которые были и у параметра &lt;strong&gt;Authentication&lt;/strong&gt;. А именно - нельзя было изменять этот уровень при первом подключении к WMI. Делалось это так:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$a = Get-WmiObject Win32_share -filter "Name = 'sharename'"&lt;br&gt;$a.PSBase.Scope.Options.Impersonation = 4&lt;/font&gt; или &lt;font color="#0000ff"&gt;Delegate&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;7) &lt;strong&gt;-EnableAllPrivileges&lt;/strong&gt; - ключ. Данный ключ включает все привилегии безопасности (семейство &lt;strong&gt;SeSecurity Privilege&lt;/strong&gt;), которыми обладает пользователь. Я уже не раз отмечал, что при работе в системе из графической оболочки Explorer, &lt;strong&gt;LSA&lt;/strong&gt; &lt;em&gt;(Local Security Authority)&lt;/em&gt; прозрачно для пользователя включает привилегии при необходимости. Однако, в целях безопасности для скриптов LSA по умолчанию не включает их. Привилегии безопасности нужны для многих операций, как смена владельца объектов, редактирования списков ACL множества объектов, выполнение критических для системы операции как удаление журналов событий, восстановления системы из точек восстановления и т.д. И только WMI нам предлагает интерфейс для их использования. Причём теперь это делается простым указанием ключа при использовании командлета &lt;strong&gt;Get-WmiObject&lt;/strong&gt;. В общем смысле в версии 1.0 нельзя было из скриптов включать привилегии, хотя по факту данный функционал был заложен и активно использовался:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;$a = Get-WmiObject Win32_share -filter "Name = 'sharename'"&lt;br&gt;$a.PSBase.Scope.Options.EnablePrivileges = $true&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;В этом отношении PowerShell является менее безопасным, чем, к примеру, VBS, который позволяет включать только необходимые привилегии безопасности (например для смены владельца объекта только &lt;strong&gt;SeRestorePrivilege&lt;/strong&gt; и &lt;strong&gt;SeTakeOwnershipPrivilege&lt;/strong&gt;). Причём VBS может очень гибко работать с подключаемыми привилегиями, что делает код более безопасным. В PowerShell они включаются все сразу и отдельные привилегии включать нельзя.&lt;/p&gt;
&lt;p&gt;Вот, в принципе и рассмотрели основые полезные и интересные нововведения в командлет &lt;strong&gt;Get-WmiObject&lt;/strong&gt; для работы с WMI в PowerShell V2 CTP3. Я допускаю, что эти параметры к релизу вряд ли претерпят существенные изменения и будут справедливы и в финальной версии V2.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=2a531ba4-0af2-47f7-9d17-e310eb527f2e"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,2a531ba4-0af2-47f7-9d17-e310eb527f2e.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
      <category>PowerShell / WMI</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb</wfw:commentRss>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - SystemRestore</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</link>
      <pubDate>Sat, 03 Jan 2009 11:45:20 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;В версии 2.0 появились командлеты, которые позволяют в однострочном режиме управлять параметрами восстановления системы. В них входят:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Get-ComputerRestorePoint&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Checkpoint-Computer&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Restore-Computer&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Enabe-ComputerRestore&lt;/STRONG&gt; 
&lt;LI&gt;&lt;STRONG&gt;Disable-ComputerRestore&lt;/STRONG&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Мой вариант костылей для версии 1.0 описан здесь: &lt;A href="http://www.sysadmins.lv/PermaLink,guid,6b653dd4-47f2-41b2-b13e-284c1270acd8.aspx"&gt;SystemRestore и PowerShell&lt;/A&gt;. По сути в версии 1.0 доступно большинство функционала V2, но только в виде самописных функций, в V2 уже есть всё (или почти всё) в коробке. Для работы этих командлетов так же потребуются клиентские версии ОС Windows XP/Windows Vista. Посмотрим их попорядку:&lt;/P&gt;
&lt;P&gt;1) &lt;STRONG&gt;Get-ComputerRestorePoint&lt;/STRONG&gt; - получает список доступных точек восстановления.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-ComputerRestorePoint &lt;EM&gt;490&lt;/EM&gt;&lt;/FONT&gt; - 490 - опциональный параметр, который позволяет получить сведения о конкретной точке восстановления.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-ComputerRestorePoint

CreationTime           Description                    SequenceNumber    EventType         RestorePointType
------------           -----------                    --------------    ---------         ----------------
2008.12.29. 21:14:04   Windows Installer installed... 490               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2008.12.29. 21:56:01   Windows Update                 491               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2008.12.29. 21:58:55   Windows Update                 492               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2008.12.31. 1:38:08    Windows Update                 493               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.01. 21:53:49   Windows Installer installed... 494               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.01. 22:03:01   Windows Installer installed... 495               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.02. 1:38:06    Windows Update                 496               BEGIN_SYSTEM_C... APPLICATION_INSTALL
2009.01.02. 19:45:27   Windows Installer installed... 497               BEGIN_SYSTEM_C... APPLICATION_INSTALL


[System32] Get-ComputerRestorePoint 490 | select *


__GENUS          : 2
__CLASS          : SystemRestore
__SUPERCLASS     :
__DYNASTY        : SystemRestore
__RELPATH        : SystemRestore.SequenceNumber=490
__PROPERTY_COUNT : 5
__DERIVATION     : {}
__SERVER         : THOR
__NAMESPACE      : root\default
__PATH           : \\THOR\root\default:SystemRestore.SequenceNumber=490
CreationTime     : 20081229191404.400068-000
Description      : Windows Installer installed Quest PowerGUI 1.5.3.
EventType        : 100
RestorePointType : 0
SequenceNumber   : 490
Scope            : System.Management.ManagementScope
Path             : \\THOR\root\default:SystemRestore.SequenceNumber=490
Options          : System.Management.ObjectGetOptions
ClassPath        : \\THOR\root\default:SystemRestore
Properties       : {CreationTime, Description, EventType, RestorePointType...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers       : {dynamic}
Site             :
Container        :



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Если посмотреть внимательней, то можно легко заметить, что данный командлет (как и все остальные, которые относятся к SystemRestore) реализован через тот же WMI класс &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa378951.aspx"&gt;SystemRestore&lt;/A&gt;. Поэтому на эти командлеты будут накладываться ограничения, которые накладывает этот класс. Это и версия ОС и права доступа. В данном случае для работы с командлетами восстановления системы нужны права администратора и для Windows Vista - проход запроса UAC.&lt;/P&gt;
&lt;P&gt;2) &lt;STRONG&gt;Checkpoint-Computer&lt;/STRONG&gt; - создаёт новую точку восстановления. Синтаксис командлета может быть такой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Checkpoint-Computer -RestorePointType Application_Install -Description CustomDescription&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;-RestorePointType&lt;/STRONG&gt; может иметь следующие значения:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;APPLICATION_INSTALL 
&lt;LI&gt;APPLICATION_UNINSTALL 
&lt;LI&gt;DEVICE_DRIVER_INSTALL 
&lt;LI&gt;MODIFY_SETTINGS 
&lt;LI&gt;CANCELLED_OPERATION&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;-Description&lt;/STRONG&gt; может иметь любое значение, поскольку это будет всего лишь описание. Но лучше использовать рекомендованные значения для описаний, которые документированы в статье MSDN: &lt;A target=_blank href="http://msdn.microsoft.com/en-us/library/aa378916(VS.85).aspx"&gt;Restore Point Description Text&lt;/A&gt;. Стандартизация в наше время - это очень важно. Время создания точки восстановления на моём нотебуке составило чуть больше минуты и на экране консоли будет такой псевдографический прогресс-бар:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellV2CTP3SystemRestore_B2EC/systemrestore_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=systemrestore src="http://www.sysadmins.lv/content/binary/WindowsLiveWriter/PowerShellV2CTP3SystemRestore_B2EC/systemrestore_thumb.jpg" width=909 height=205&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;я вот тоже хочу как-нибудь научиться делать такие прогресс-бары.&lt;/P&gt;
&lt;P&gt;3) &lt;STRONG&gt;Restore-Computer&lt;/STRONG&gt; - восстанавливает компьютер до указанной точки восстановления:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Restore-Computer -RestorePoint 490 &lt;EM&gt;-Confirm -WhatIf&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;в параметре &lt;STRONG&gt;-RestorePoint&lt;/STRONG&gt; указывается номер точки восстановления, который можно получить командой &lt;STRONG&gt;Get-ComputerRestorePoint&lt;/STRONG&gt;. Данный командлет обладает ещё опциональными параметрами &lt;STRONG&gt;-Confirm&lt;/STRONG&gt;, который будет требовать подтверждения пользователя и &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt;, который будет полезен в отладочных целях.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; после успешного выполнения данной команды компьютер будет перезагружен в обязательном порядке для завершения восстановления.&lt;/P&gt;
&lt;P&gt;4) &lt;STRONG&gt;Enable-ComputerRestore&lt;/STRONG&gt; - включает режим восстановления системы для всех дисков или для определённых.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Enable-ComputerRestore &lt;EM&gt;-Drive "C:\" -WhatIf&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Параметры &lt;STRONG&gt;-Drive&lt;/STRONG&gt; и &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt; являются не обязательными. Если не указан &lt;STRONG&gt;-Drive&lt;/STRONG&gt;, то восстановление системы будет включено для всех допустимых дисков в системе.&lt;/P&gt;
&lt;P&gt;5) &lt;STRONG&gt;Disable-ComputerRestore&lt;/STRONG&gt; - отключает режим восстановления системы для всех дисков или определеённых:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Disable-ComputerRestore &lt;EM&gt;-Drive "C:\" -WhatIf&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Параметры &lt;STRONG&gt;-Drive&lt;/STRONG&gt; и &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt; являются не обязательными. Если не указан &lt;STRONG&gt;-Drive&lt;/STRONG&gt;, то восстановление системы будет отключено для всех дисков в системе.&lt;/P&gt;
&lt;P&gt;К сожалению функционал изменения настроек SystemRestore, как резервирование места для точек восстановления, время хранения, периодичность создания точек не реализован в командлетах. А ведь лишним это не будет однозначно. Поэтому в отношении CTP3 эти вещи придётся реализовывать с помощью WMI самостоятельно.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,1d22ee4c-f6b3-484d-b92c-a0f3b4945fbb.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
    <item>
      <trackback:ping>http://www.sysadmins.lv/Trackback.aspx?guid=cd4be53d-581c-4280-97f9-24ab21388325</trackback:ping>
      <pingback:server>http://www.sysadmins.lv/pingback.aspx</pingback:server>
      <pingback:target>http://www.sysadmins.lv/PermaLink,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</pingback:target>
      <dc:creator>Camelot</dc:creator>
      <wfw:comment>http://www.sysadmins.lv/CommentView,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</wfw:comment>
      <wfw:commentRss>http://www.sysadmins.lv/SyndicationService.asmx/GetEntryCommentsRss?guid=cd4be53d-581c-4280-97f9-24ab21388325</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Обзор новых командлетов PowerShell V2 CTP3 - Eventlog</title>
      <guid isPermaLink="false">http://www.sysadmins.lv/PermaLink,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</guid>
      <link>http://www.sysadmins.lv/PermaLink,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</link>
      <pubDate>Fri, 02 Jan 2009 20:11:19 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;PowerShell V2 CTP3 вышел уже давно (23 декабря прошлого года), но всё никак не доходили руки осветить новые командлеты. Сегодня постараюсь рассказать о новых возможностях работы с журналами событий готовыми командлетами. Функционал этих командлетов я уже реализовывал немного раньше:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx"&gt;Управление EventLog в PowerShell с использованием .NET&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://www.sysadmins.lv/PermaLink,guid,8684b90f-8e8a-43fe-89e8-cf8194c21c3d.aspx"&gt;Управление EventLog в PowerShell с использованием WMI&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Но плюс новых командлетов в том, что это уже готовые командлеты, а не костыли в виде отдельных функций. Безусловно, ещё не всё работает как положено, но обзор уже делать можно. Итак, список командлетов:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Get-WinEvent &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;New-EventLog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Write-EventLog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Clear-Eventlog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Limit-EventLog &lt;/STRONG&gt;
&lt;LI&gt;&lt;STRONG&gt;Remove-EventLog&lt;/STRONG&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;начнём попорядку: &lt;/P&gt;
&lt;P&gt;1) &lt;STRONG&gt;Get-WinEvent&lt;/STRONG&gt;. Данный командлет призван заменить ранее использовавшийся командлет Get-Eventlog. Синтаксис команды может быть следующий:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ListLog * | ft -a

LogName                                                                   MaximumSizeInBytes RecordCount  LogMode
-------                                                                   ------------------ -----------  -------
Application                                                                         20971520       17003 Circular
DFS Replication                                                                     15532032           6 Circular
HardwareEvents                                                                      20971520           0 Circular
Internet Explorer                                                                    1052672           0 Circular
Key Management Service                                                              20971520           0 Circular
ODiag                                                                               16777216         267 Circular
OSession                                                                            16777216         544 Circular
Security                                                                            33554432       16904 Circular
System                                                                              20971520       43146 Circular
Windows PowerShell                                                                  15728640       16803 Circular
ForwardedEvents                                                                     20971520             Circular
Microsoft-Windows-Backup                                                             1052672           6 Circular
Microsoft-Windows-Bits-Client/Analytic                                               1052672             Circular
Microsoft-Windows-Bits-Client/Operational                                            1052672        2226 Circular
....&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Показ всех журналов событий в системе, включая журналы в &lt;STRONG&gt;Application and Services Logs&lt;/STRONG&gt; (для Vista/2008). Вместо звёздочки можно указать конкретный журнал событий.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;Примечание:&lt;/FONT&gt;&lt;/STRONG&gt; некоторые журналы, как &lt;STRONG&gt;Security&lt;/STRONG&gt; будут генерировать ошибку, если вы исполняете эту команду под обычным пользователем.&lt;/P&gt;
&lt;P&gt;Последняя колонка показывает режим очистки журнала. &lt;STRONG&gt;Circular&lt;/STRONG&gt; означает перезапись более старых событий по мере необходимости. Так же можно посмотреть список провайдеров, которые регистрируют события в журнале:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ListProvider *

Name                                                        LogLinks
----                                                        --------
.NET Runtime                                                {Application}
.NET Runtime Optimization Service                           {Application}
Active Server Pages                                         {Application}
Application                                                 {Application}
Application Error                                           {Application}
Application Hang                                            {Application}
Application Management                                      {Application}
ASP.NET 1.1.4322.0                                          {Application}
ASP.NET 2.0.50727.0                                         {Application}
CardSpace 3.0.0.0                                           {Application}
Chkdsk                                                      {Application}
Crystal Reports                                             {Application}
DataDynamics ActiveBar 1.0                                  {Application}
Desktop Window Manager                                      {Application}
devenv                                                      {Application}
....&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Вот образец провайдеров. Это может быть очень удобным, когда вам нужна выборка именно логов конкретного провайдера. Делается это следующей командой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Get-WinEvent -ProviderName "Application Hang"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;В кавычках просто указываете поставщика событий. Сами события можно посмотреть следующим образом:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ProviderName "Application Hang" -MaxEvents 1 | select *


Message              :
Id                   : 1002
Version              :
Qualifiers           : 0
Level                : 2
Task                 : 101
Opcode               :
Keywords             : 36028797018963968
RecordId             : 16431
ProviderName         : Application Hang
ProviderId           :
LogName              : Application
ProcessId            :
ThreadId             :
MachineName          : Thor
UserId               :
TimeCreated          : 2008.12.21. 17:19:47
ActivityId           :
RelatedActivityId    :
ContainerLog         : application
MatchedQueryIds      : {}
Bookmark             : System.Diagnostics.Eventing.Reader.EventBookmark
LevelDisplayName     :
OpcodeDisplayName    :
TaskDisplayName      :
KeywordsDisplayNames : {}
Properties           : {System.Diagnostics.Eventing.Reader.EventProperty, System.Diagnostics.Eventing.Reader.EventPrope
                       rty, System.Diagnostics.Eventing.Reader.EventProperty, System.Diagnostics.Eventing.Reader.EventP
                       roperty...}



[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;вот так выглядят внутренности события. Однако, свойство &lt;STRONG&gt;Message&lt;/STRONG&gt; ничего не содержит, хотя предполагается, что там должен быть текст самого эвента. Пустое оно потому что:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Get-WinEvent -ProviderName "Application Hang" -MaxEvents 1 | gm -MemberType noteproperty


   TypeName: System.Diagnostics.Eventing.Reader.EventLogRecord

Name    MemberType   Definition
----    ----------   ----------
Message NoteProperty  Message=null


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;в членах объекта мы видим, что свойство &lt;STRONG&gt;Message&lt;/STRONG&gt; заткнуто заглушкой (&lt;STRONG&gt;Message=null&lt;/STRONG&gt;) и оно ничего не возвращает. Но текст события можно извлечь из свойства &lt;STRONG&gt;Properties&lt;/STRONG&gt;:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] (Get-WinEvent -ProviderName "Application Hang" -MaxEvents 1).properties

Value
-----
mstsc.exe
6.0.6002.18000
ac0
01c9637bc8453f5e
8
{67, 0, 114, 0...}


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;текст тут невнятный совсем. Для некоторых событий он возвращает такой же текст, что и в графическом журнале событий (и которые корректно отображаются командлетом Get-EventLog). Те события, которые не показывает корректно Get-EventLog в новом командлете уже не показывают ничего.&amp;nbsp; Тут вся надежда на разработчиков, что они наконец-то сделают возможность полностью видеть тексты всех эвентов журнала событий, в противном случае придётся снова забивать костыли с помощью адского WMI. Но тут следует обратить внимание на параметр MaxEvents. Без его указания поиск только нескольких событий (например, первых 10 с использованием &lt;STRONG&gt;Select -First 10&lt;/STRONG&gt;) займёт значительное время, поскольку команда будет работать пока весь журнал не будет прочёсан. Этот параметр является аналогом параметра -&lt;STRONG&gt;Newest&lt;/STRONG&gt; для &lt;STRONG&gt;Get-EventLog&lt;/STRONG&gt;. Поэтому если вы хотите посмотреть только часть событий, то используйте этот параметр. В общем смысле это выглядит так:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;старая нотация: &lt;FONT color=#0000ff&gt;Get-EventLog application -Source "Application Hang" -Newest 5&lt;/FONT&gt; 
&lt;LI&gt;новая нотация: &lt;FONT color=#0000ff&gt;Get-WineVent -ProviderName "Application Hang" -MaxEvents 5&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;И ещё одно хорошее отличие нового командлета - теперь не обязательно указывать журнал для поиска. Вы можете указать только поставщика событий и количество событий для вывода. Это очень удобно.&lt;/P&gt;
&lt;P&gt;Следовательно можно судить, что новый командлет Get-WinEvent является значимо более лучшим, чем прежний Get-EventLog. Хотя его применимость в настоящее время весьма сомнительна, поскольку работу с текстом событий так никто и не сделал.&lt;/P&gt;
&lt;P&gt;2) &lt;STRONG&gt;New-EventLog&lt;/STRONG&gt;. Нетрудно догадаться, что этот командлет создаёт новый журнал событий:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;New-EventLog -LogName "Custom EventLog" -Source "Custom Source"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] New-EventLog -LogName "Custom EventLog" -Source "Custom Source"
[System32] Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  20 480      0 OverwriteAsNeeded      17 011 Application
     512      7 OverwriteOlder              0 Custom EventLog
  15 168      0 OverwriteAsNeeded           6 DFS Replication
  20 480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20 480      0 OverwriteAsNeeded           0 Key Management Service
  16 384      0 OverwriteAsNeeded         267 ODiag
  16 384      0 OverwriteAsNeeded         544 OSession
  32 768      0 OverwriteAsNeeded      16 908 Security
  20 480      0 OverwriteAsNeeded      43 162 System
  15 360      0 OverwriteAsNeeded      16 920 Windows PowerShell


[System32] Get-WinEvent -ListProvider "custom Source"

Name                                                        LogLinks
----                                                        --------
Custom Source                                               {Custom EventLog}


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Всё очень просто. Внизу я сделал проверку, что наш провайдер событий успешно зарегистрировался и он будет писать только в журнал &lt;STRONG&gt;Custom EventLog&lt;/STRONG&gt;. Так же можно и добавлять события (поставщиков) к существующим журналам. Для этого в параметре &lt;STRONG&gt;-LogName&lt;/STRONG&gt; нужно указать существующий журнал.&lt;/P&gt;
&lt;P&gt;3) &lt;STRONG&gt;Write-Eventlog&lt;/STRONG&gt;. Так же по смыслу можно догадаться, что данный командлет добавляет записи в журнал событий. Общий синтаксис его такой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Write-EventLog -LogName "Custom EventLog" -Source "Custom Source" -EntryType Information -EventID 1 -Message "Привет мир!"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;EntryType может иметь следующие значения: &lt;STRONG&gt;Error, Warning, Information, SuccessAudit, FailureAudit&lt;/STRONG&gt;. Об этом я уже говорил ранее &lt;A target=_blank href="http://www.sysadmins.lv/PermaLink,guid,093ff83e-d892-4f04-b21c-a7fa234eaccd.aspx"&gt;здесь&lt;/A&gt;. Смотрим:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[[System32] Write-EventLog -LogName "Custom EventLog" -Source "Custom Source" -EntryType Information -EventID 1 -Message
"Привет мир!"
[System32] Get-WinEvent -ProviderName "Custom source"

TimeCreated                   ProviderName                                             Id Message
-----------                   ------------                                             -- -------
2009.01.02. 21:05:06          Custom Source                                             1


[System32] Get-WinEvent -ProviderName "Custom source" | select *


Message              :
Id                   : 1
Version              :
Qualifiers           : 0
Level                : 4
Task                 : 1
Opcode               :
Keywords             : 36028797018963968
RecordId             : 1
ProviderName         : Custom Source
ProviderId           :
LogName              : Custom EventLog
ProcessId            :
ThreadId             :
MachineName          : Thor
UserId               :
TimeCreated          : 2009.01.02. 21:05:06
ActivityId           :
RelatedActivityId    :
ContainerLog         : custom eventlog
MatchedQueryIds      : {}
Bookmark             : System.Diagnostics.Eventing.Reader.EventBookmark
LevelDisplayName     :
OpcodeDisplayName    :
TaskDisplayName      :
KeywordsDisplayNames : {}
Properties           : {System.Diagnostics.Eventing.Reader.EventProperty}



[System32] (Get-WinEvent -ProviderName "custom source").Properties

Value
-----
Привет мир!


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Первой строкой мы создали новое событие в журнале, второй посмотрели общую сводку по провайдеру &lt;STRONG&gt;Custom Source&lt;/STRONG&gt;, которого мы создали ранее. В нём уже зарегистрировано одно событие, которое мы посмотрели в расширенном виде. И последней строкой посмотрели текст созданного события.&lt;/P&gt;
&lt;P&gt;Спросите вы, какая польза от этого, ведь кроме программистов это мало кому нужно? А польза есть от него. Для примера можно взять резервное копирование. Например, у администратор регулярно выполняются скрипты, которые делают резервное копирование данных. И создав нового провайдера или новый журнал администратор может в скрипт добавить код, который будет лог копирования помещать в журнал событий помимо стандартной процедуры отправки лога к себе на почту. Это может оказаться очень удобным! Так же данный командлет содержит параметр &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt;, который следует использовать в отладочных целях.&lt;/P&gt;
&lt;P&gt;4) &lt;STRONG&gt;Clear-EventLog&lt;/STRONG&gt;. Очистка журнала:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Clear-EventLog -LogName "Custom EventLog"&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;тут всё проще постого. Указываете имя журнала и очищаем его:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Clear-EventLog "Custom EventLog"
[System32] Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  20 480      0 OverwriteAsNeeded      17 011 Application
     512      7 OverwriteOlder              0 Custom EventLog
  15 168      0 OverwriteAsNeeded           6 DFS Replication
  20 480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20 480      0 OverwriteAsNeeded           0 Key Management Service
  16 384      0 OverwriteAsNeeded         267 ODiag
  16 384      0 OverwriteAsNeeded         544 OSession
  32 768      0 OverwriteAsNeeded      16 908 Security
  20 480      0 OverwriteAsNeeded      43 165 System
  15 360      0 OverwriteAsNeeded      16 920 Windows PowerShell


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Во второй строчке мы уже видим, что нами созданный журнал очистился от тестового сообщения. Данный командлет содержит параметр -&lt;STRONG&gt;WhatIf&lt;/STRONG&gt;, который следует использовать в отладочных целях.&lt;/P&gt;
&lt;P&gt;5) &lt;STRONG&gt;Limit-EventLog&lt;/STRONG&gt;. Позволяет изменять размер журнала и политику перезаписи журнала. Общий синтаксис такой:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Limit-EventLog -LogName "Custom EventLog" -MaximumSize 64mb -OverflowAction OverWriteOlder -RetentionDays 10&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE style="BACKGROUND-COLOR: black; FONT: 9pt courier new; COLOR: #fff"&gt;&lt;FONT color=#009500&gt;&lt;SPAN #009500?; background-color: black?&gt;[System32] Limit-EventLog -LogName "Custom EventLog" -MaximumSize 64mb -OverflowAction OverWriteOlder -RetentionDays 10
[System32] Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  20 480      0 OverwriteAsNeeded      17 011 Application
  65 536     10 OverwriteOlder              0 Custom EventLog
  15 168      0 OverwriteAsNeeded           6 DFS Replication
  20 480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder              0 Internet Explorer
  20 480      0 OverwriteAsNeeded           0 Key Management Service
  16 384      0 OverwriteAsNeeded         267 ODiag
  16 384      0 OverwriteAsNeeded         544 OSession
  32 768      0 OverwriteAsNeeded      16 908 Security
  20 480      0 OverwriteAsNeeded      43 165 System
  15 360      0 OverwriteAsNeeded      16 920 Windows PowerShell


[System32]&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Здесь мы задали размер журнала в 64 мегабайта и политику перезаписи старых логов старше 10 дней.&lt;/P&gt;
&lt;P&gt;6) &lt;STRONG&gt;Remove-EventLog&lt;/STRONG&gt;. Удаляет журнал событий или провайдера событий:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Remove-EventLog -Source "Custom Source"&lt;/FONT&gt; - удаляет провайдера событий из системы&lt;BR&gt;&lt;FONT color=#0000ff&gt;Remove-EventLog -LogName "Custom EventLog"&lt;/FONT&gt; - удаляет указанный журнал из системы&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;И этот командлет содержит параметр &lt;STRONG&gt;-WhatIf&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;В принципе, есть ещё командлет &lt;STRONG&gt;Remove-Event&lt;/STRONG&gt;, который должен позволять удалять события из журналов событий, но мне пока что не удалось заставить его работать. Но вообще удаление эвентов из журналов событий - плохая и порочная практика, которая ни к чему хорошему не приведёт.&lt;/P&gt;
&lt;P&gt;Вот мы и рассмотрели все новые командлеты в PowerShell V2 CTP3, которые относятся к работе с журналами событий (эвентлогами). В самом начале поста я привёл ссылки, на альтернативные решения, которые повторяют функционал этих командлетов для версии 1.0, но и даже умеют немножко больше (например, архивация и ротация архивов эвентлогов). В целом можно оценить позитив от новых командлетов, которые позволяют нам более удобным способом работать с журналами событий. Но всё равно нужно ждать рабочего решения, который смог бы получать тексты сообщений из журналов Windows Vista/Windows Server 2008, поскольку без него все эти нововведения мало кому будут нужны. Вобщем, как-то так.&lt;/P&gt;&lt;img width="0" height="0" src="http://www.sysadmins.lv/aggbug.ashx?id=cd4be53d-581c-4280-97f9-24ab21388325"/&gt;&lt;br/&gt;&lt;hr/&gt;PowerShell Powered - http://www.sysadmins.lv&lt;/div&gt;</description>
      <comments>http://www.sysadmins.lv/CommentView,guid,cd4be53d-581c-4280-97f9-24ab21388325.aspx</comments>
      <category>PowerShell</category>
      <category>PowerShell / PowerShell V2</category>
    </item>
  </channel>
</rss>