<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://zine.net.pl/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">arkadiusz.wasniewski</title><subtitle type="html" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/atom.aspx</id><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/default.aspx" /><link rel="self" type="application/atom+xml" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61129.2">Community Server</generator><updated>2008-12-16T15:53:15Z</updated><entry><title>TreeNode w wersji koguciej</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/12/20/treenode-w-wersji-koguciej.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/12/20/treenode-w-wersji-koguciej.aspx</id><published>2009-12-20T16:30:00Z</published><updated>2009-12-20T16:30:00Z</updated><content type="html">&lt;p&gt;Kilkukrotnie już zdarzyło się, iż potrzebowałem klasy, która umożliwiłaby zapamiętanie typowanych (typed, generic) struktur hierarchicznych (hierarchical collection) czyli dowolnego obiektu wraz z jego elementami potomnymi. W ramach platformy .NET istnieją już klasy implementujące podobną funkcjonalność. Mowa tu oczywiście o &lt;font color="#2b91af"&gt;TreeNode&lt;/font&gt; z &lt;font color="#2b91af"&gt;TreeNodeCollection&lt;/font&gt; oraz o, bardziej hermetycznym, &lt;font color="#2b91af"&gt;MenuItem&lt;/font&gt; wraz z wewnętrznym &lt;font color="#2b91af"&gt;MenuItemCollection&lt;/font&gt;. Klasy przeznaczone do obsługi menu trudno byłoby użyć do własnych rozwiązań. &lt;font color="#2b91af"&gt;TreeNode&lt;/font&gt; jest zaś “ciężka” i brak w niej typowania, czyli możliwości określenia typu przechowywanego obiektu (precz z rzutowaniem!).&lt;/p&gt;  &lt;p&gt;Z tego też powodu stworzyłem razu pewnego własną implementację struktury hierarchicznej. Nie jest ona skomplikowana. Punktem wyjścia jest klasa przechowująca dane wraz z kolekcją elementów potomnych:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; T _item;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span&gt;LightTreeNodeCollection&lt;/span&gt;&amp;lt;T&amp;gt; _nodes;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; LightTreeNode(T item)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _item = item;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _nodes = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;LightTreeNodeCollection&lt;/span&gt;&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; T Value&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _item; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span&gt;LightTreeNodeCollection&lt;/span&gt;&amp;lt;T&amp;gt; Nodes&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _nodes; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Kolekcja przechowująca potomków dla ułatwienia operowania implementuje interfejs &lt;font color="#2b91af"&gt;ICollection&amp;lt;T&amp;gt;&lt;/font&gt;:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span&gt;LightTreeNodeCollection&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span&gt;ICollection&lt;/span&gt;&amp;lt;&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt; _list;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; _owner;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; LightTreeNodeCollection(&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; owner)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _owner = owner;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;List&lt;/span&gt;&amp;lt;&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; Owner&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _owner; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; Add(T item)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; node = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;(item);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list.Add(node);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; node;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Implementation of IEnumerable&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span&gt;IEnumerator&lt;/span&gt;&amp;lt;&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;&amp;gt; GetEnumerator()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; _list.GetEnumerator();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;IEnumerator&lt;/span&gt; &lt;span&gt;IEnumerable&lt;/span&gt;.GetEnumerator()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetEnumerator();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Implementation of ICollection&amp;lt;LightTreeNode&amp;lt;T&amp;gt;&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Add(&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; item)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list.Add(item);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Clear()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;for&lt;/span&gt;(&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; _list.Count; i++){&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list[i].Nodes.Clear();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list.Clear();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; Contains(&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; item)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; _list.Contains(item);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; CopyTo(&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt;[] array, &lt;span style="color:blue;"&gt;int&lt;/span&gt; arrayIndex)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list.CopyTo(array, arrayIndex);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; Remove(&lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;T&amp;gt; item)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;int&lt;/span&gt; index = _list.IndexOf(item);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt;(index &amp;lt; 0){&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list[index].Nodes.Clear();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _list.Remove(item);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; Count&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; _list.Count; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; IsReadOnly&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;false&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Przykład zastosowania to chociażby przygotowanie dla widoku (&lt;b&gt;View&lt;/b&gt;) poleceń menu z poziomu prezentera (&lt;b&gt;Presenter&lt;/b&gt;, &lt;b&gt;Presentation Model&lt;/b&gt;):&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;-moz-background-clip:border;-moz-background-origin:padding;-moz-background-inline-policy:continuous;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; menu = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;&lt;span&gt;Command&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;Command&lt;/span&gt;(&lt;span&gt;&amp;quot;Opcje&amp;quot;&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;LightTreeNode&lt;/span&gt;&amp;lt;&lt;span&gt;Command&lt;/span&gt;&amp;gt; submenu = menu.Nodes.Add(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;Command&lt;/span&gt;(&lt;span&gt;&amp;quot;Nawigacja&amp;quot;&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; submenu.Nodes.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;Command&lt;/span&gt;(&lt;span&gt;&amp;quot;Pierwszy&amp;quot;&lt;/span&gt;, MoveFirst));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; submenu.Nodes.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span&gt;Command&lt;/span&gt;(&lt;span&gt;&amp;quot;Ostatni&amp;quot;&lt;/span&gt;, MoveLast));&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;PS. Dla uproszczenia kodu usunięto wszystkie wywołania &lt;font color="#2b91af"&gt;Debug&lt;/font&gt;&lt;b&gt;.Assert&lt;/b&gt; sprawdzające poprawność wywołań.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=4549" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author></entry><entry><title>(K)Cultura w PowerShell</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/12/18/k-cultura-w-powershell.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/12/18/k-cultura-w-powershell.aspx</id><published>2009-12-18T22:19:23Z</published><updated>2009-12-18T22:19:23Z</updated><content type="html">&lt;p&gt;“Bo kultura tu naprawdę jest, świadczy o tym nasz wspaniały Dom Kultury” śpiewał w 1988 roku w Jarocinie zespół “Zielone Żabki”. Ktoś pamięta? Dziś też będzie o kulturze, ale przez literę c czyli o Culture. Tekst zaś dotyczył będzie tak prozaicznej kwestii jak polskie znaki narodowe.&lt;/p&gt;  &lt;p&gt;Zacznijmy od początku. Utwórzmy, np. w Notatniku, plik w formacie CSV zawierający nazwy ptaków z polskimi znakami narodowymi:&lt;/p&gt;  &lt;pre&gt;	id,nazwa
	1,Gżegżółka
	2,Żuraw
	3,Łabędź&lt;/pre&gt;

&lt;p&gt;I spróbujmy go wczytać korzystając ze standardowego polecenia PowerShell:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Import-Csv&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;c:\ptaki.csv&lt;/span&gt;&lt;span style="color:#800000;"&gt;'&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Jak sie można domyśleć (wstęp to sugerował) to, co ujrzą nasze oczy nie będzie ładne. Zamiast polskich znaków będą mniej lub bardziej nieokreślone śmieci (zależy gdzie uruchomimy nasz kod) zgodne z UTF8. Skąd wiemy, że z UTF8? Empirycznie będzie można to sprawdzić za chwil kilka.&lt;/p&gt;

&lt;p&gt;Wstępnie problem został więc rozwiązany. Jak natomiast zmusić PowerShell do wczytania pliku CSV zgodnie z polską stroną kodową? Okazuje się, iż najłatwiej jest skorzystać z polecenia &lt;font color="#5f9ea0"&gt;Get-Content&lt;/font&gt;, które domyślnie bierze pod uwagę ustawienia regionalne systemu operacyjnego komputera. &lt;/p&gt;

&lt;pre&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="color:#800000;"&gt;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;c:\ptaki.csv&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:#5f9ea0;font-weight:bold;"&gt;ConvertFrom-Csv&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Dzięki zaś poleceniu &lt;font color="#5f9ea0"&gt;ConvertFrom-Csv&lt;/font&gt; oraz skorzystania z potoku możemy cieszyć się poprawnością wyświetlania:&lt;/p&gt;

&lt;pre&gt;	id	nazwa                                         
	--	-----                                         
	1	Gżegżółka                                     
	2	Żuraw                                         
	3	Łabędź                                        &lt;/pre&gt;

&lt;p&gt;Polecenie &lt;font color="#5f9ea0"&gt;Get-Content&lt;/font&gt; posiada również, co ciekawe, parametr &lt;font color="#5f9ea0"&gt;Encoding&lt;/font&gt;, który pozwala ustawić kilka możliwych stron kodowych. Nie są to powalające ilości, ale zawsze coś. W przypadku ustawienia kodowania na &lt;font color="#800000"&gt;UTF8&lt;/font&gt; otrzymamy dane w postaci identycznej jak w przypadku polecenia &lt;font color="#5f9ea0"&gt;Import-Csv&lt;/font&gt;. Aby natomiast uzyskać efekt identyczny jak w przypadku wywołania tego polecenia bez strony kodowej należy parametr &lt;font color="#5f9ea0"&gt;Encoding&lt;/font&gt; ustawić na wartość &lt;font color="#800000"&gt;String&lt;/font&gt;.&lt;/p&gt;

&lt;pre&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="color:#800000;"&gt;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;c:\ptaki.csv&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;-Encoding&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt; | &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;ConvertFrom-Csv&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Co zaś w przypadku kiedy możliwości lingwistyczne standardowych poleceń PowerShell nas nie usatysfakcjonują? Zawsze możemy skorzystać z metod klas platformy .NET:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    [&lt;/span&gt;&lt;span style="color:#008080;"&gt;System.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;c:\ptaki.csv&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:#008080;"&gt;System.Text.Encoding&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;GetEncoding&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1250&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) | &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;ConvertFrom-Csv&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;I na koniec inny, niż skorzystanie z Notatnika, wariant tworzenia plików CSV:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Set-Content&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;c:\ptaki.csv&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;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;id,nazwa&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:#5f9ea0;font-weight:bold;"&gt;Add-Content&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;c:\ptaki.csv&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;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;1,Gżegżółka&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:#5f9ea0;font-weight:bold;"&gt;Add-Content&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;c:\ptaki.csv&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;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;2,Żuraw&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:#5f9ea0;font-weight:bold;"&gt;Add-Content&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;c:\ptaki.csv&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;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;3,Łabędź&lt;/span&gt;&lt;span style="color:#800000;"&gt;'&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Oczywiście w tych poleceniach również możemy skorzystać z parametru &lt;font color="#5f9ea0"&gt;Encoding&lt;/font&gt;.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=4546" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term=".NET" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/.NET/default.aspx" /><category term="PowerShell" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/PowerShell/default.aspx" /></entry><entry><title>Pobranie projektów rozwiązania czyli Regex w akcji</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/10/08/pobranie-projekt-w-rozwi-zania-czyli-regex-w-akcji.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/10/08/pobranie-projekt-w-rozwi-zania-czyli-regex-w-akcji.aspx</id><published>2009-10-07T22:17:20Z</published><updated>2009-10-07T22:17:20Z</updated><content type="html">&lt;p&gt;Asumpt do poniższego rozwiązania dostarczył skrypt PowerShell, który kompiluje projekty pewnego mojego rozwiązania, i gdzie zapałałem chęcią automatycznego uaktualnienia numeru wersji we wszystkich plikach &lt;strong&gt;AssemblyInfo.cs&lt;/strong&gt;. Ale gdzież są te wszystkie pliki? No w projektach…&lt;/p&gt;  &lt;p&gt;Najprostszy sposób dotarcia do projektów to odczytanie pliku &lt;strong&gt;.sln&lt;/strong&gt;. Hm… ale to oznacza analizowanie zawartości. Z pomocą przyszły wyrażenia regularne oraz świadomość istnienia jasno określonej struktury pliku &lt;strong&gt;.sln&lt;/strong&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;font color="#000080"&gt;Project\(&amp;quot;\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\}&amp;quot;\) = &amp;quot;(?&amp;lt;projectName&amp;gt;[^&amp;quot;]+)&amp;quot;, &amp;quot;(?&amp;lt;projectFolder&amp;gt;[^&amp;quot;]+)&amp;quot;, &amp;quot;(?&amp;lt;projectGuid&amp;gt;[^&amp;quot;]+)&amp;quot;\nEndProject&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Oczywiście kilka słów wyjaśnienia. Po pierwsze wszystkie projekty rozwiązania jak i również foldery (&lt;strong&gt;Solution Folders&lt;/strong&gt;) są umieszczane w sekcji zaczynającej się od słów &lt;font color="#000080"&gt;Project&lt;/font&gt; a kończącej się na &lt;font color="#000080"&gt;EndProject&lt;/font&gt;. Elementy będące projektami są oznaczone odpowiednim identyfikatorem Guid (konkretnie &lt;font color="#000080"&gt;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&lt;/font&gt;). Następnie w cudzysłowach danej sekcji mamy kolejno nazwę projektu, ścieżkę względną do projektu oraz unikalny identyfikator Guid przypisany do danego projektu. Dla ułatwienia pobierania informacji zastosowałem grupy nazwane. Czas na prosty przykład użycia:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#800080;"&gt;$pattern&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;Project\(`&amp;quot;\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\}`&amp;quot;\) = &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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;`&amp;quot;(?&amp;lt;projectName&amp;gt;[^`&amp;quot;]+)`&amp;quot;, &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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;`&amp;quot;(?&amp;lt;projectFolder&amp;gt;[^`&amp;quot;]+)`&amp;quot;, &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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;`&amp;quot;(?&amp;lt;projectGuid&amp;gt;[^`&amp;quot;]+)`&amp;quot;\r\nEndProject&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;$regex&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:#800080;"&gt;$pattern&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$solution&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.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;d:\Solution\MySolution.sln&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;$regex&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;Matches&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$solution&lt;/span&gt;&lt;span style="color:#000000;"&gt;) | &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;ForEach-Object&lt;/span&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:#800080;"&gt;$_&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Groups[&lt;/span&gt;&lt;span style="color:#800000;"&gt;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectName&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:#5f9ea0;font-weight:bold;"&gt;Write-Host&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;.Groups[&lt;/span&gt;&lt;span style="color:#800000;"&gt;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectFolder&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:#5f9ea0;font-weight:bold;"&gt;Write-Host&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;.Groups[&lt;/span&gt;&lt;span style="color:#800000;"&gt;'&lt;/span&gt;&lt;span style="color:#800000;"&gt;projectGuid&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:#5f9ea0;font-weight:bold;"&gt;Write-Host&lt;/span&gt;&lt;span style="color:#000000;"&gt;
}
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ze względu na składnię PowerShell wzorzec wyrażenia regularnego został nieco zmodyfikowany.&lt;/p&gt;

&lt;p&gt;PS. Oczywiście można również zastosować prostsze wyrażenie regularne:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p align="left"&gt;&lt;font color="#000080"&gt;\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\}&amp;quot;\) = &amp;quot;(?&amp;lt;projectName&amp;gt;[^&amp;quot;]+)&amp;quot;, &amp;quot;(?&amp;lt;projectFolder&amp;gt;[^&amp;quot;]+)&amp;quot;, &amp;quot;(?&amp;lt;projectGuid&amp;gt;[^&amp;quot;]+)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;lub też bardziej odporne na potencjalne błędy (czy aby na pewno takie będą?):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p align="left"&gt;&lt;font color="#000080"&gt;\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\}&amp;quot;\)\s*=\s*&amp;quot;(?&amp;lt;projectName&amp;gt;[^&amp;quot;]+)&amp;quot;,\s*&amp;quot;(?&amp;lt;projectFolder&amp;gt;[^&amp;quot;]+)&amp;quot;,\s*&amp;quot;(?&amp;lt;projectGuid&amp;gt;[^&amp;quot;]+)&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ale to już sztuka dla sztuki.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=4246" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="PowerShell" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/PowerShell/default.aspx" /><category term="Regular Expressions" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Regular+Expressions/default.aspx" /></entry><entry><title>Zacznij od nowej strony, ale nie drukuj pustej</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/05/27/zacznij-od-nowej-strony-ale-nie-drukuj-pustej.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/05/27/zacznij-od-nowej-strony-ale-nie-drukuj-pustej.aspx</id><published>2009-05-27T09:43:34Z</published><updated>2009-05-27T09:43:34Z</updated><content type="html">&lt;p&gt;Jakiś czas temu podałem sposób na &lt;a title="Zacznij od nowej strony" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/02/25/zacznij-od-nowej-strony.aspx" target="_blank"&gt;rozwiązanie problemu&lt;/a&gt; drukowania w ramach kontrolki &lt;strong&gt;List&lt;/strong&gt; podraportów zaczynając każdorazowo od nowej strony. Efektem było niestety drukowanie na koniec pustej strony. Wydawałoby się, iż wystarczy jedynie kontrolkę &lt;strong&gt;Rectangle&lt;/strong&gt; na koniec wyłączyć i marnotrawstwo papieru oraz nadszarpywanie naszej reputacji zostanie zlikwidowane. W tym celu właściwości &lt;strong&gt;Hidden&lt;/strong&gt; przypisałem wyrażenie:&lt;/p&gt;  &lt;blockquote&gt;&lt;strong&gt;=IIF(RowNumber(“DataSet”) &amp;lt; CountRows(“DataSet”), False, True)&lt;/strong&gt; &lt;/blockquote&gt;  &lt;p&gt;Analiza jest trywialna: dopóki bieżący numer wiersza jest mniejszy od liczby wszystkich wierszy w danym zbiorze danych kontrolka &lt;strong&gt;Rectangle&lt;/strong&gt; jest wyświetlana.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="Właściwości kontrolki Rectangle" src="http://zine.net.pl/photos/posts_pictures/images/3659/original.aspx" /&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;Właściwości kontrolki Rectangle&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Okazuje się jednak, iż jakiekolwiek wyrażenie powoduje ignorowanie wstawiania znaku końca strony (&lt;strong&gt;PageBreakAtEnd = True&lt;/strong&gt;)! Prosty eksperyment polega na zamianie wartości &lt;strong&gt;False&lt;/strong&gt; na wyrażenie &lt;strong&gt;=False&lt;/strong&gt;. Ot błąd w implementacji (nota bene zdaje się, iż jest on od wersji Microsoft SQL Server 2000).&lt;/p&gt;  &lt;p&gt;Rozwiązanie?!&lt;/p&gt;  &lt;p&gt;Ech… Rozbicie tego na dwie kontrolki &lt;strong&gt;Rectangle&lt;/strong&gt;. Pierwsza sprawdza i ustawia tylko właściwość &lt;strong&gt;Hidden&lt;/strong&gt; oraz zawiera drugą kontrolkę &lt;strong&gt;Rectangle&lt;/strong&gt;. Ta druga, wewnętrzna kontrolka dopiero ustawia &lt;strong&gt;PageBreakAtEnd&lt;/strong&gt; na &lt;strong&gt;True&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;PS. Opisywany problem dotyczy na pewno Reporting Services w wersji 2005. Pozostałych wersji nie sprawdzałem.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3662" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Reporting Services" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Reporting+Services/default.aspx" /></entry><entry><title>Hook scripts w PowerShell</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/05/22/hook-scripts-w-powershell.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/05/22/hook-scripts-w-powershell.aspx</id><published>2009-05-22T19:32:44Z</published><updated>2009-05-22T19:32:44Z</updated><content type="html">&lt;p&gt;Dawno, dawno temu (choć może nie aż tak dawno) popełniłem &lt;a title="Hook scripts w C#" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/02/12/hook-scripts-w-c.aspx"&gt;notkę&lt;/a&gt; na temat skryptów przechwytujących (&lt;strong&gt;hook scripts&lt;/strong&gt;) dla repozytoriów systemu kontroli wersji &lt;a title="Subversion" href="http://www.open.collab.net/downloads/subversion/"&gt;Subversion&lt;/a&gt;. Chodziło o uniemożliwienie zapisania w repozytorium zmian, jeśli nie został podany do nich żaden komentarz wyjaśniający. Proponowany kod wyglądał mniej więcej tak:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; repositoryPath = args[0];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; transactionName = args[1];&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; process = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Process&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.StartInfo.FileName = &lt;span style="color:#a31515;"&gt;&amp;quot;svnlook.exe&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.StartInfo.Arguments = &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;log -t {0} {1}&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; transactionName, repositoryPath);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.StartInfo.UseShellExecute = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.StartInfo.RedirectStandardOutput = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.StartInfo.CreateNoWindow = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.Start();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; output = process.StandardOutput.ReadToEnd();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; process.WaitForExit();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; regex = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;[a-zA-Z0-9]&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!regex.IsMatch(output)){&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.Error.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Brak opisu poczynionych zmian.&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; 1;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; 0;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ostatnio pomyślałem czemu by nie wykorzystać do wspomożenia Subversion języka PowerShell. Wykoncypowałem, iż w katalogu, w którym są składowane repozytoria założę folder &lt;strong&gt;scripts&lt;/strong&gt;, który będzie zawierał skrypty PowerShell, a do którego będą sięgały pliki wsadowe (&lt;strong&gt;batch files&lt;/strong&gt;) wywoływane przez SVN w katalogu &lt;strong&gt;hooks&lt;/strong&gt; danego repozytorium.&lt;/p&gt;  &lt;p&gt;Pierwsza wersja skryptu sprawdzającego istnienie komentarza do zachowywanych zmian była następująca:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$repositoryPath&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;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[0]
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$transactionName&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;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[1]
        
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$message&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; svnlook.exe log -t &lt;/span&gt;&lt;span style="color:#800080;"&gt;$transactionName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$repositoryPath&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;$message&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;-notmatch&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;[a-zA-Z0-9]&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:#5f9ea0;font-weight:bold;"&gt;Write-Error&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;Brak opisu poczynionych zmian.&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:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Okazało się jednak, iż nie funkcjonuje on w zadowalający sposób. Po pierwsze niepoprawnie był zwracany do systemu status zakończenia skryptu (&lt;strong&gt;dos exit code&lt;/strong&gt;). Rozwiązań znalezionych po poszukiwaniach w sieci było kilka. Ale najbardziej sensowne, w mojej opinii oczywiście, polegało na skorzystaniu ze specjalnej zmiennej PowerShell &lt;span style="color:#000080;"&gt;$host&lt;/span&gt;. Drugi problem wiązał się z komunikatem zwrotnym, który chciałem przekazać użytkownikowi próbującemu zatwierdzić zmiany. Aby wiadomość mogła być wyświetlona musi ona zostać wysłana do standardowego strumienia zawierającego błędy. Niestety okazało się, iż skorzystanie z polecenia &lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Write-Error&lt;/span&gt; jest niemal tożsame z wyrzuceniem w tym miejscu wyjątku &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;. Użytkownik, poza komunikatem zwrotnym, ze skryptu otrzymywał również dodatkowe informacje na temat kategorii błędów, miejsca wystąpienia etc. Niedobrze. Na szczęście PowerShell będąc opartym o platformę .NET pozwala bez problemów korzystać z jej bibliotek. Wiadomość dla użytkownika wysłałem więc tak jak w kodzie C# do standardowego strumienia błędów &lt;strong&gt;System.&lt;/strong&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;&lt;strong&gt;.Error&lt;/strong&gt;. A oto końcowa wersja skryptu:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$repositoryPath&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;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[0]
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$transactionName&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;$args&lt;/span&gt;&lt;span style="color:#000000;"&gt;[1]
        
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$message&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; svnlook.exe log -t &lt;/span&gt;&lt;span style="color:#800080;"&gt;$transactionName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$repositoryPath&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;$message&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;-notmatch&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;[a-zA-Z0-9]&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:#008080;"&gt;System.Console&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;Error&lt;/span&gt;&lt;span style="color:#000000;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;WriteLine&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;Brak opisu poczynionych zmian.&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:#000080;"&gt;$host&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetShouldExit(&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Jak już delikatnie powyżej zasugerowałem, skrypt PowerShell nie może być niestety wywołany bezpośrednio przez Subversion. Do tego konieczny jest pośredni plik wsadowy (&lt;strong&gt;batch file&lt;/strong&gt;). I tutaj również nie obyło się bez niespodzianek. Pierwsza wersja pliku prezentowała się tak:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
  &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; powershell -noprofile ..\..\scripts\pre-commit.ps1 %1 %2&lt;/p&gt;

  &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit errorlevel&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Okazało się jednak, iż ścieżka dostępu do katalogu ze skryptami nie jest tworzona poczynając od miejsca wywołania pliku wsadowego, tylko od ścieżki &lt;strong&gt;C:\Windows\system32&lt;/strong&gt;. W ramach plików wsadowych można skorzystać ze zmiennej &lt;strong&gt;%CD%&lt;/strong&gt;, która zawiera aktualny katalog. W tym wypadku nic to jednak nie dało. Nie pomogło nawet zapisanie wartości &lt;strong&gt;%CD%&lt;/strong&gt; w zmiennej tymczasowej skryptu i późniejsze wykorzystanie jej przy tworzeniu ścieżki. Rozwiązaniem okazało się natomiast skorzystanie z makra &lt;strong&gt;%~dp0&lt;/strong&gt;. Ostatecznie zawartość pliku wsadowego ustabilizowała się na poniższym zapisie:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
  &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; powershell -noprofile&amp;#160; %~dp0\..\..\scripts\pre-commit.ps1 %1 %2&lt;/p&gt;

  &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit errorlevel&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Co ciekawe zupełnie nie sprawdziło się również polecane również sprawdzanie zmiennej &lt;span style="color:#000080;"&gt;$LASTEXITCODE&lt;/span&gt; zamiast &lt;strong&gt;ERRORLEVEL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wiemy już, iż przedstawiane rozwiązanie posiada jedną niedogodność – konieczne jest posiłkowanie się plikami wsadowymi aby osiągnąć zamierzony efekt. Czy można to pominąć? Ano można. Należy skorzystać z parametru &lt;strong&gt;–Command&lt;/strong&gt; w czasie wywołania powłoki PowerShell w pliku wsadowym i zapisać wewnątrz ciągu &lt;strong&gt;“&amp;amp; “&lt;/strong&gt; cały kod skryptu pamiętając, aby wszystko znalazło się w jednej linii oraz, by kolejne bloki kodu oddzielone były znakiem średnika.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;
  &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; powershell.exe -noprofile -command &amp;quot;&amp;amp; {$message = svnlook.exe log -t $args[1] $args[0];if($message -notmatch '[a-zA-Z0-9]'){[System.Console]::Error.WriteLine('Brak opisu poczynionych zmian.');$host.SetShouldExit(1)}}&amp;quot; %1 %2&lt;/p&gt;

  &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exit errorlevel&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Dla skrócenia zapisu parametry skryptu przekazuję bezpośrednio do aplikacji &lt;strong&gt;svnlook.exe&lt;/strong&gt; bez tworzenia zmiennych pomocniczych &lt;span style="color:#800080;"&gt;$repositoryPath&lt;/span&gt; i &lt;span style="color:#800080;"&gt;$transactionName&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Podsumowanie? Cóż. Skrypty przechwytujące (&lt;strong&gt;hook scripts&lt;/strong&gt;) w PowerShell to chyba jednak w tym przypadku sztuka dla sztuki. Szybciej i sprawniej będzie skorzystanie &lt;a title="Hook scripts w C#" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/02/12/hook-scripts-w-c.aspx"&gt;z kodu C#&lt;/a&gt;. Choć zawsze można się czegoś pożytecznego przy okazji nauczyć.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3603" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term=".NET" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/.NET/default.aspx" /><category term="Subversion" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Subversion/default.aspx" /><category term="PowerShell" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/PowerShell/default.aspx" /></entry><entry><title>Kiedy nie działa tryb zgodności w Windows 7</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/05/20/kiedy-nie-dzia-a-tryb-zgodno-ci-w-windows-7.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/05/20/kiedy-nie-dzia-a-tryb-zgodno-ci-w-windows-7.aspx</id><published>2009-05-20T08:48:18Z</published><updated>2009-05-20T08:48:18Z</updated><content type="html">&lt;p&gt;W razie problemów z działaniem aplikacji w systemie Windows 7 można we właściwościach danego programu &lt;strong&gt;(Properties –&amp;gt; Comaptibility&lt;/strong&gt;) włączyć tryb zgodności (&lt;strong&gt;Compatibility mode&lt;/strong&gt;) poprzez wybranie wcześniejszej wersji systemu operacyjnego. Do dyspozycji mamy:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows 95; &lt;/li&gt;    &lt;li&gt;Windows 98 / Windows Me; &lt;/li&gt;    &lt;li&gt;Windows NT 4.0 z Service Pack 5; &lt;/li&gt;    &lt;li&gt;Windows 2000; &lt;/li&gt;    &lt;li&gt;Windows XP z Service Pack w wersji 2 lub 3; &lt;/li&gt;    &lt;li&gt;Windows Server 2003 z Service Pack 1; &lt;/li&gt;    &lt;li&gt;Windows Vista; &lt;/li&gt;    &lt;li&gt;Windows Vista z Service Pack 1 lub 2. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Rozwiązanie to jednak nie zadziała poprawnie jeśli aplikacja samodzielnie sprawdza wersję systemu i od tego uzależnia swoją dalszą pracę. Weźmy dla przykładu poniższy kod:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;StructLayout&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;LayoutKind&lt;/span&gt;.Sequential, CharSet = &lt;span style="color:#2b91af;"&gt;CharSet&lt;/span&gt;.Auto)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OSVERSIONINFO&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; OSVersionInfoSize;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MajorVersion;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MinorVersion;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; BuildNumber;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; PlatformId;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;MarshalAs&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;UnmanagedType&lt;/span&gt;.ByValTStr, SizeConst = 128)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; CSDVersion;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;DllImport&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = &lt;span style="color:#2b91af;"&gt;CharSet&lt;/span&gt;.Auto, SetLastError = &lt;span style="color:blue;"&gt;true&lt;/span&gt;)]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;extern&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; GetVersionEx([&lt;span style="color:#2b91af;"&gt;In&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Out&lt;/span&gt;] &lt;span style="color:#2b91af;"&gt;OSVERSIONINFO&lt;/span&gt; ver);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; structure = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;OSVERSIONINFO&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; structure.OSVersionInfoSize = &lt;span style="color:#2b91af;"&gt;Marshal&lt;/span&gt;.SizeOf(structure);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetVersionEx(structure);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;Wersja systemu: {0}.{1}&amp;quot;&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; structure.MajorVersion,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; structure.MinorVersion));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadKey();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Jaki system nie wybierzemy w trybie zgodności, dla Windows 7 RC wynik zawsze będzie identyczny: &lt;strong&gt;Wersja systemu: 6.1&lt;/strong&gt; (podobnie zresztą jak dla Windows Server 2008 R2).&lt;/p&gt;  &lt;p&gt;PS. Z powyższych przyczyn w Windows 7 póki co nie działa między innymi &lt;a href="http://support.wdc.com/product/download.asp?level1=1&amp;amp;lang=en"&gt;WD Anywhere Backup&lt;/a&gt;. Jest to więc kwestia aplikacji a nie problemów z samym systemem operacyjnym.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3575" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term=".NET" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/.NET/default.aspx" /><category term="Og&amp;#243;lne" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Og_26002300_243_3B00_lne/default.aspx" /><category term="Interop" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Interop/default.aspx" /></entry><entry><title>Usuwanie informacji o lokalnej kopii roboczej Subversion</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/04/15/usuwanie-informacji-o-lokalnej-kopii-roboczej-subversion.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/04/15/usuwanie-informacji-o-lokalnej-kopii-roboczej-subversion.aspx</id><published>2009-04-15T12:07:03Z</published><updated>2009-04-15T12:07:03Z</updated><content type="html">&lt;p&gt;Z przyczyn mniej lub bardziej zrozumiałych koniecznym było, aby usunąć z kilku projektów katalogi zawierające informacje o lokalnej kopii roboczej Subversion &lt;strong&gt;_svn&lt;/strong&gt;. Przy braku połączenia z repozytorium kodu ręczne usuwanie to dłubanina i gwarantowana depresja. Z pomocą przyszedł PowerShell. Jak zwykle. Poniżej skrypt usuwający to co trzeba tam gdzie trzeba:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&gt;&lt;span style="color:#000000;"&gt;Clear-Host
&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:#ff0000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Read-Host&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;Folder przeznaczony do wyczyszenia z katalogów _svn: &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:#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:#800080;"&gt;$path&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;_svn&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;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;-Filter&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;FullName&lt;/span&gt;&lt;span style="color:#000000;"&gt; | 
    &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Remove-Item&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;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;Write-Host&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;Operacja usuwania katalogów _svn zakończona pomyślnie.&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Krótko, zwięźle i na temat.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3349" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Subversion" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Subversion/default.aspx" /><category term="PowerShell" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/PowerShell/default.aspx" /></entry><entry><title>Pokaż wszystkim swoje hasło</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/04/01/poka-wszystkim-swoje-has-o.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/04/01/poka-wszystkim-swoje-has-o.aspx</id><published>2009-04-01T07:50:21Z</published><updated>2009-04-01T07:50:21Z</updated><content type="html">&lt;p&gt;&lt;a title="Profil Anety Sidorowicz na LinkedIn" href="http://www.linkedin.com/in/anetasidorowicz" target="_blank"&gt;Aneta Sidorowicz&lt;/a&gt; na swoim &lt;a title="Blog Anety Sidorowicz" href="http://necica-as.spaces.live.com/default.aspx" target="_blank"&gt;blogu&lt;/a&gt; (a jakże!) zrobiła małe, subiektywne &lt;a title="C2C&amp;#39;09 pod drugiej stronie lustra" href="http://necica-as.spaces.live.com/blog/cns!7502F322F4B86C6D!311.entry" target="_blank"&gt;zestawienie&lt;/a&gt; osób organizujących (mających wkład w) konferencję &lt;a title="Konferencja C2C 2009" href="http://2009.communities2communities.org.pl/" target="_blank"&gt;C2C 2009&lt;/a&gt;.&amp;#160; Zestawienie przeczytałem i ponieważ zabrakło mi w nim jednej osoby, popełniłem komentarz do wpisu. Jakież było moje zdziwienia (przerażenie wręcz) kiedy jako podpis osoby wystawiającej komentarz wyświetliła się moja nazwa użytkownika i hasło (!!!) mojego profilu Windows Live. Zgroza, to po prostu jest zgroza. Dobrze, że użytkownik dodający komentarz może też go usunąć. Okazało się, iż domyślna nazwa wyświetlana profilu zawierała takie dane… Brrrr…&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3255" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Og&amp;#243;lne" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Og_26002300_243_3B00_lne/default.aspx" /></entry><entry><title>Communities to Communities – nowy adres witryny</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/03/30/communities-to-communities-nowy-adres-witryny.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/03/30/communities-to-communities-nowy-adres-witryny.aspx</id><published>2009-03-30T09:01:36Z</published><updated>2009-03-30T09:01:36Z</updated><content type="html">&lt;p&gt;Chciałbym poinformować, iż nastąpiła zmiana adresu &lt;strong&gt;Communities to Communities&lt;/strong&gt;. Witryna konferencji dostępna jest obecnie pod adresem &lt;a href="http://communities2communities.org.pl"&gt;http://communities2communities.org.pl&lt;/a&gt;. Przepraszamy z zamieszanie i utrudnienia tym spowodowane.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3233" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Konferencja" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Konferencja/default.aspx" /></entry><entry><title>TDD versus BDD</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/03/17/tdd-versus-bdd.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/03/17/tdd-versus-bdd.aspx</id><published>2009-03-17T11:02:37Z</published><updated>2009-03-17T11:02:37Z</updated><content type="html">&lt;p&gt;Testy, testy, testy. Najpierw. Przed właściwym kodem. A może po? Co testować? Wszystko? Jeśli tworzymy zbiór publicznych typów (interfejs pakietu) to testowane powinno być jak najbardziej wszystko i to szczegółowo. To jest Test Dirven Driven Development (TDD). Część publiczna jest naszym kontraktem informującym jaki będzie&amp;#160; rezultat operacji przy określonych parametrach. Niestety w chwili obecnej możliwości języków programowania są ograniczone jeśli chodzi o precyzyjne definiowanie dozwolonych wartości przekazywanych do metod i właściwości. Dlatego też musimy się posiłkować wyjątkami oraz dokumentacją do poszczególnych elementów kontraktu.&lt;/p&gt;  &lt;p&gt;Ale jeśli powstające metody i właściwości są w typach wewnętrznych względem przestrzeni nazw, a co za tym idzie pakietu? Czy mam sprowadzać swoje życie do absurdu? Jest oczywiste, że nie będę sprawdzał w każdej metodzie parametrów i wyrzucał w przypadku wadliwych danych wyjątków. Na takim poziomie bardziej interesuje mnie poprawność wykonania ścieżki logicznej, zachowania. Moje intencje oznaczam wówczas w kodzie metodami &lt;span style="color:#2b91af;"&gt;Debug&lt;/span&gt;&lt;strong&gt;.Assert&lt;/strong&gt;. W dalszym ciągu dostarczany przeze mnie kod stanowi kontrakt, ale nie sprawdzam poprawności wszystkich parametrów, nie wyrzucam wyjątków. Taki zaś jest Behavior Driven Development (BDD).&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3101" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Metodyka" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Metodyka/default.aspx" /><category term="Testowanie oprogramowania" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Testowanie+oprogramowania/default.aspx" /></entry><entry><title>Raymond Lewallen w Polsce</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/03/09/raymond-lewallen-w-polsce.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/03/09/raymond-lewallen-w-polsce.aspx</id><published>2009-03-09T22:45:14Z</published><updated>2009-03-09T22:45:14Z</updated><content type="html">&lt;p&gt;Wraz z konferencją &lt;a title="Konferencja 4Developers" href="http://4developers.org.pl/"&gt;4Developers&lt;/a&gt; swoje tourne po Polsce rozpoczął &lt;a title="Blog Raymonda Lewallena" href="http://codebetter.com/blogs/raymond.lewallen/default.aspx"&gt;Raymond Lewallen&lt;/a&gt; - znany bloger portalu &lt;a title="Blogernia CodeBetter.com" href="http://codebetter.com/"&gt;CodeBetter.com&lt;/a&gt;. W czasie wizyty odwiedzi i spotka się z grupami off-line z następujących miast:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Kraków: 8 marca; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ms-groups.pl/communities/Lists/Kalendarz%20grup/DispForm.aspx?ID=139"&gt;Katowice&lt;/a&gt;: 9 marca; &lt;/li&gt;    &lt;li&gt;&lt;a title="40. spotkanie WG.NET" href="http://ms-groups.pl/wg.net/Lists/Calendar/DispForm.aspx?ID=44"&gt;Warszawa&lt;/a&gt;: 10 marca; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ms-groups.pl/communities/Lists/Kalendarz%20grup/DispForm.aspx?ID=134"&gt;Poznań&lt;/a&gt;: 11 marca; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ms-groups.pl/communities/Lists/Kalendarz%20grup/DispForm.aspx?ID=135"&gt;Toruń&lt;/a&gt;: 12 marca; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ms-groups.pl/communities/Lists/Kalendarz%20grup/DispForm.aspx?ID=137"&gt;Gdańsk&lt;/a&gt;: 13 marca. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Zaprezentuje on między innymi następujące tematy:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Behavior Driven Development; &lt;/li&gt;    &lt;li&gt;Building DSLs and Fluent Interfaces in C#. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Więcej informacji można znaleźć na stronach grup w ramach portalu &lt;a title="Społeczności off-line" href="http://ms-groups.pl/communities/Strony/default.aspx"&gt;ms-groups.pl&lt;/a&gt;. Zapraszamy!&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3036" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Og&amp;#243;lne" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Og_26002300_243_3B00_lne/default.aspx" /><category term="Spotkania" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Spotkania/default.aspx" /></entry><entry><title>Zacznij od nowej strony</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/02/25/zacznij-od-nowej-strony.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/02/25/zacznij-od-nowej-strony.aspx</id><published>2009-02-25T14:26:23Z</published><updated>2009-02-25T14:26:23Z</updated><content type="html">&lt;p&gt;Wyświetlanie w Reporting Services podraportu w ramach raportu nie jest trudne. Schody zaczynają się jednak wtedy, kiedy zapragniemy dany podraport wyświetlić wiele razy zaczynając za każdym razem od nowej strony. To już nie jest takie łatwe. Istnieje wiele zasad co i w jakiej kolejności jest wykonywane w czasie przygotowania strony do&amp;#160; &lt;a title="Rendering Report Items" href="http://technet.microsoft.com/en-us/library/bb677570.aspx" target="_blank"&gt;wyświetlenia&lt;/a&gt;. Istnieje również wiele pomysłów jak zlikwidować problemy z niemożnością rozpoczynania podraportów na nowej stronie. Najzabawniejsze rozwiązanie jakie widziałem to takie, w którym autor przekonywał, iż podraport należy po prostu przekopiować do raportu…&lt;/p&gt;  &lt;p&gt;Moje rozwiązanie jest proste i skuteczne – zawsze działa. W ramach raportu umieszczam kontrolkę &lt;strong&gt;List&lt;/strong&gt;, do której wstawiam kontrolkę &lt;strong&gt;Subreport&lt;/strong&gt;. I teraz najważniejsze. Poniżej kontrolki &lt;strong&gt;Subreport&lt;/strong&gt;, ale ciągle w ramach &lt;strong&gt;List&lt;/strong&gt; umieszczam kontrolkę &lt;strong&gt;Rectangle&lt;/strong&gt;. Ustalam wysokość bramowania na 0,1 cm aby nie burzyć wyglądu. Na koniec ustawiam właściwość &lt;strong&gt;PageBreakAtEnd&lt;/strong&gt; na &lt;strong&gt;True&lt;/strong&gt;. I to wystarczy. Życie staje się prostsze.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=3000" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Reporting Services" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Reporting+Services/default.aspx" /></entry><entry><title>Konfiguracja Reporting Services przy pomocy PowerShell</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/02/20/konfiguracja-reporting-services-przy-pomocy-powershell.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/02/20/konfiguracja-reporting-services-przy-pomocy-powershell.aspx</id><published>2009-02-20T13:42:11Z</published><updated>2009-02-20T13:42:11Z</updated><content type="html">&lt;p&gt;Od pewnego czasu mam przyjemność budować od podstaw system raportowy w jednej z firm finansowych. Dzięki temu możliwe jest przejście przeze mnie całej ścieżki związanej z instalacją, konfiguracją serwera i uprawnień, tworzeniem raportów oraz ich zarządzaniem.&lt;/p&gt;  &lt;p&gt;Pierwsze czynności są zawsze takie same. Trzeba pogrupować raporty według określonych przez właściciela biznesowego kategorii oraz nadać uprawnienia dostępu do poszczególnych raportów. Najłatwiej powiązać kategorie z działami występującymi w danej firmie oraz nałożyć uprawnienia dostępu na poziomie folderów. Oczywiście z biegiem czasu, kiedy raportów powstaje coraz więcej i rośnie świadomość użytkowników, zaczynają się pojawiać żądania dotyczące modyfikacji uprawnień, dostępu grup do folderów lub poszczególnych raportów. Przy dużej liczbie raportów i dużej liczbie tego typu żądań zarządzanie uprawnieniami zaczyna stawać się zadaniem, któremu może się okazać, iż poświęcamy zbyt wiele czasu.&lt;/p&gt;  &lt;h3&gt;Ograniczenia&lt;/h3&gt;  &lt;p&gt;Załóżmy, iż na serwerze raportów mamy zdefiniowaną następującą strukturę folderów oraz zawartych w nich raportów:&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="Struktura folderów i raportów" src="http://zine.net.pl/photos/posts_pictures/images/2929/original.aspx" width="612" height="252" /&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;Przykładowa struktura folderów i raportów&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Do folderu &lt;strong&gt;Folder_1&lt;/strong&gt; dostęp ma grupa użytkowników &lt;strong&gt;Grupa_1&lt;/strong&gt;, która jednocześnie nie ma dostępu do folderu &lt;strong&gt;Folder_2&lt;/strong&gt;. W jaki sposób &lt;strong&gt;Grupa_1&lt;/strong&gt; ma mieć zrealizowany dostęp do raportu &lt;strong&gt;Raport_2_3&lt;/strong&gt;?&lt;/p&gt;  &lt;p&gt;Pierwszy sposób do zrobienie skrótu (&lt;strong&gt;link&lt;/strong&gt;) w &lt;strong&gt;Folder_1&lt;/strong&gt; raportu &lt;strong&gt;Raport_2_3&lt;/strong&gt;. Ale w zaprezentowanej strukturze &lt;strong&gt;Raport_2_3&lt;/strong&gt; korzysta z podraportu &lt;strong&gt;Podraport_2_3_1&lt;/strong&gt; oraz wywołuje raport &lt;strong&gt;Raport_2_2&lt;/strong&gt;. To oznacza, iż podraport oraz odniesienie do raportu &lt;strong&gt;Raport_2_2&lt;/strong&gt; w folderze &lt;strong&gt;Folder_&lt;/strong&gt;1 nie będą działać z powodu braku uprawnień. Czy zrobienie w związku z tym skrótu do &lt;strong&gt;Podraport_2_3_1&lt;/strong&gt; i &lt;strong&gt;Raport_2_2&lt;/strong&gt; w folderze &lt;strong&gt;Folder_1&lt;/strong&gt; rozwiąże nam problem? Niestety nie. &lt;strong&gt;Raport_2_3&lt;/strong&gt; dalej będzie się odwoływać do zawartości folderu &lt;strong&gt;Folder_2&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Jak inaczej można rozwiązać ten problem? Drugi sposób polega na wgraniu interesujących nas raportów całkowicie od nowa do właściwego folderu. Tylko, że takie podejście powoduje, iż przy dużej ilości takich zależności zarządzanie uaktualnianiem definicji raportu staje się pracochłonne i podatne na błędy – trzeba bowiem uaktualnić wszystkie wersje danego raportu w systemie.&lt;/p&gt;  &lt;p&gt;Trzeci sposób wiąże się ze zmianą zarządzania uprawnieniami. Zamiast zarządzać dostępem na poziomie folderów należy przejść na poziom poszczególnych raportów. Problem w tym, iż uprawnienia folderu nadrzędnego to suma uprawnień wszystkich raportów i podfolderów. Jest to konieczne aby użytkownik mógł dostać się do folderu w celu przeglądania dostępnych raportów. Przez to łatwiejszym staje popełnienie błędu i udostępnienie dowolnego raportu wszystkim grupom, które mają dostęp do danego folderu.&lt;/p&gt;  &lt;p&gt;Ze skrótami do raportów wiąże się jeszcze jeden ważny problem. Załóżmy, iż z jakiś względów do raportów w folderze &lt;strong&gt;Folder_2&lt;/strong&gt; dostęp uzyskuje grupa &lt;strong&gt;Grupa_1&lt;/strong&gt;. Uprawnienia są przyznawane na poziomie folderu. Następnie w folderze &lt;strong&gt;Folder_2&lt;/strong&gt; tworzony jest skrót do raportu &lt;strong&gt;Raport_3_1&lt;/strong&gt; z folderu &lt;strong&gt;Folder_3&lt;/strong&gt;. Efektem tych zmian jest możliwość wywoływania raportu &lt;strong&gt;Raport_3_1&lt;/strong&gt; przez grupę &lt;strong&gt;Grupa_1&lt;/strong&gt; mimo, iż może wcale nie to było naszym celem.&lt;/p&gt;  &lt;h3&gt;Wybór rozwiązania&lt;/h3&gt;  &lt;p&gt;Co w takim razie powinniśmy zrobić aby ogarnąć temat konfiguracji uprawnień? To co mnie się od razu nasunęło było skorzystanie ze skryptu. Nad wyborem języka skryptowego niewiele się zastanawiałem. Wybór PowerShell’a był w sumie dość oczywisty. Pozostało jedynie wybrać sposób komunikacji z&amp;#160; usługami raportującymi. Pierwsza możliwość to skorzystanie z programu &lt;strong&gt;rs.exe&lt;/strong&gt; dostępnego po instalacji Reporting Services. Aplikacja ta nie umożliwia jednak wykonywania bardziej zaawansowanych czynności przez co nie będziemy mogli z niej skorzystać. A sposób drugi?&lt;/p&gt;  &lt;p&gt;Usługi raportujące składają się z dwóch aplikacji webowych:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;ReportManager&lt;/strong&gt;; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ReportServer&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Użytkownik końcowy najczęściej korzysta z &lt;strong&gt;ReportManager&lt;/strong&gt; udostępnianej pod nazwą &lt;strong&gt;Reports&lt;/strong&gt;. Aplikacja ta umożliwia między innymi przeglądanie i wyświetlanie raportów w ramach przeglądarki internetowej. &lt;strong&gt;ReportServer &lt;/strong&gt;dostarcza natomiast usługi sieciowe wykorzystywane przez &lt;strong&gt;ReportManager&lt;/strong&gt; w celu pobierania, wyświetlania i modyfikowania zawartości bazy danych serwera raportów.&lt;/p&gt;  &lt;p&gt;Usługi sieciowe i PowerShell. Czemu nie…&lt;/p&gt;  &lt;h3&gt;PowerShell i Policy&lt;/h3&gt;  &lt;p&gt;Kilka słów na temat zabezpieczeń PowerShell. Domyślnie po instalacji można uruchamiać jedynie skrypty podpisane. Poziom uprawnień można sprawdzić wpisując w konsoli PowerShell polecenie &lt;strong&gt;Get-ExecutionPolicy&lt;/strong&gt;. Dozwolone wartości to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Restricted&lt;/strong&gt;;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;AllSigned&lt;/strong&gt;;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;RemoteSigned&lt;/strong&gt;;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Unrestricted&lt;/strong&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Domyślne ograniczenie może być dla nas zbyt bolesne. Dlatego też jeśli mamy ustawiony poziom zabezpieczeń jako &lt;strong&gt;Restricted&lt;/strong&gt; lub &lt;strong&gt;AllSigned&lt;/strong&gt; możemy go zmienić na mniej restrykcyjny:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Set-ExecutionPolicy RemoteSigned&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Istnieje również możliwość skorzystania z &lt;strong&gt;Group Policy&lt;/strong&gt; o czym można przeczytać na stronach &lt;a title="Zabezpieczenia PowerShell" href="http://www.windowsecurity.com/articles/PowerShell-Security.html" target="_blank"&gt;WindowSecurity.com&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Parametry startowe&lt;/h3&gt;  &lt;p&gt;Rozpoczęcie wykonywania skryptu rozpoczynamy między innymi od zdefiniowania stałych:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;pre&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; Adres serwera raportów&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:#008080;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$reportServerAddress&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;http://localhost/reportserver/reportservice2005.asmx?WSDL&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; Miejsce składowania definicji raportów&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:#008080;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$reportProjectFolder&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;C:\Raporty\src&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; Zmienne zawierające źródła danych wymaganych przez raporty&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:#008080;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSourceReferenceName&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;/Data Sources/ReportsDataSource&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; Miejsce nadrzędne dla konfigurowanych raportów. Katalog startowy&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:#008080;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:root&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;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;oraz zmiennych globalnych:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:assembly&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;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&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;$null&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Adres serwera raportów zawsze będzie taki sam. Jedynie w przypadku konfiguracji zdalnej serwera raportów nazwę &lt;strong&gt;localhost&lt;/strong&gt; należy zastąpić nazwą lub adresem właściwego komputera. Jeśli chodzi o źródła danych to zakładam, iż są one już utworzone w ramach usług raportujących. Dzięki temu unikam zapisywania w pliku konfigurującym ścieżek dostępu i haseł do serwerów baz danych. W powyższym przykładzie zdefiniowane jest tylko jedno źródło danych, ale w może być ich (tak jak u mnie w systemie produkcyjnym) oczywiście więcej. Zmienne &lt;span style="color:#800080;"&gt;$global:assembly&lt;/span&gt; oraz &lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt; będą zawierać klasy umożliwiające zarządzanie serwerem raportów.&lt;/p&gt;

&lt;h3&gt;Przygotowanie połączenia z serwerem raportów&lt;/h3&gt;

&lt;p&gt;Część rozwiązań, między innymi funkcja &lt;span style="color:#5f9ea0;"&gt;New-WebServiceProxy&lt;/span&gt; dostępna od PowerShell V2 (CTP3), zwraca obiekt proxy umożliwiający jedynie wykonywanie operacji udostępnianych przez usługi sieciowe serwera raportów. Jest to za mało, ponieważ potrzebować będziemy również możliwości tworzenia nowych obiektów. Dlatego też jako rozwiązanie właściwe wybrałem propozycję Christiana Glessnera. Szczegóły można znaleźć we wpisie &lt;a title="PowerShell, WebServices &amp;amp; SharePoint" href="http://cglessner.blogspot.com/2008/07/powershell-webservices-sharepoint.html" target="_blank"&gt;PowerShell, WebServices &amp;amp; SharePoint&lt;/a&gt; na jego blogu. Źródła można pobrać z witryny &lt;a title="http://www.codeplex.com/iLoveSharePoint/Release/ProjectReleases.aspx" href="http://www.codeplex.com/iLoveSharePoint/Release/ProjectReleases.aspx"&gt;http://www.codeplex.com/iLoveSharePoint/Release/ProjectReleases.aspx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;W swoim rozwiązaniu wykorzystuję zmodyfikowaną wersję metody &lt;span style="color:#5f9ea0;"&gt;Get-WebServiceProxy&lt;/span&gt; ze skryptu Christiana Glessnera:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt; Create-WebServiceProxy(
        [&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;$url&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;throw&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;Brak adresu serwera raportów!&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:#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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Nawiązywanie połączenia z serwerem $url&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;$fileName&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.IO.Path&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;Combine&lt;/span&gt;&lt;span style="color:#000000;"&gt;(
            [&lt;/span&gt;&lt;span style="color:#008080;"&gt;System.Environment&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;CurrentDirectory&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;Proxy.ReportingServices2005&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:#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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$fileName.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;span style="color:#800080;"&gt;$WinSDK&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;$env:ProgramFiles\Microsoft SDKs\Windows\v6.0A\Bin&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;$Net35&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;$env:SystemRoot\Microsoft.NET\Framework\v3.5&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;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt; =&amp;amp; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$WinSdk&lt;/span&gt;&lt;span style="color:#000000;"&gt;\wsdl.exe &lt;/span&gt;&lt;span style="color:#800080;"&gt;$url&lt;/span&gt;&lt;span style="color:#000000;"&gt; /n:Proxy /out:&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$fileName.cs&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;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt; =&amp;amp; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$Net35&lt;/span&gt;&lt;span style="color:#000000;"&gt;\csc.exe /t:library /out:&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$fileName.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;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$fileName.cs&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;$global:assembly&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.Reflection.Assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;LoadFrom&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;$fileName.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;span style="color:#800080;"&gt;$proxyType&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;$global:assembly&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GetTypes() | &lt;/span&gt;&lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Where-Object&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;.IsSubclassOf(
            [System.Web.Services.Protocols.SoapHttpClientProtocol]) &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:#0000ff;"&gt;$true&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&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="font-style:italic;color:#5f9ea0;"&gt;-TypeName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$proxyType&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Połączenie nawiązane&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Jak widzimy, w powyższym kodzie tworzona, ładowana do pamięci i przechowywana w zmiennej globalnej &lt;span style="color:#800080;"&gt;$global:assembly&lt;/span&gt; jest biblioteka &lt;strong&gt;Proxy.ReportingServices2005.dll&lt;/strong&gt; zawierająca wszystkie potrzebne typy. Zmienna globalna &lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt; zawiera instancję klasy umożliwiającej odpytywanie usług sieciowych serwera raportowego znajdującego się w określonej przez nas lokalizacji.&lt;/p&gt;

&lt;p&gt;Utworzenie biblioteki &lt;strong&gt;Proxy.ReportingServices2005.dll&lt;/strong&gt; wymaga &lt;strong&gt;Microsoft SDKs&lt;/strong&gt;, które wgrywane do systemu jest automatycznie w czasie instalacji Visual Studio. Jeśli z jakiś przyczyn na serwerze, na którym uruchamiamy powyższy skrypt nie ma i nie może być zainstalowane &lt;strong&gt;Microsoft SDKs&lt;/strong&gt;, należy bibliotekę &lt;strong&gt;Proxy.ReportingServices2005.dll&lt;/strong&gt; utworzyć na komputerze programisty, a następnie przekopiować razem ze skryptem w miejsce docelowe. Rozwiązanie zadziała. Dzięki warunkowi &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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$fileName.dll&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) &lt;/span&gt;biblioteka nie będzie ponownie tworzona jeśli już istnieje.&lt;/p&gt;

&lt;p&gt;Czas na przygotowanie połączenia z serwerem raportów:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#5f9ea0;"&gt;    Create-WebServiceProxy &lt;/span&gt;&lt;span style="color:#800080;"&gt;$reportServerAddress&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Credentials &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.Net.CredentialCache&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;DefaultCredentials&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Koniecznie musimy pamiętać o przypisaniu danych uprawnionego użytkownika. W przypadku kiedy konfigurujemy &lt;strong&gt;localhost&lt;/strong&gt; wystarczy przypisać aktualnie zalogowanego do komputera użytkownika – z definicji użytkownicy lokalni mają bowiem uprawnienia administracyjne w ramach usług raportowych.&lt;/p&gt;

&lt;h3&gt;Konfiguracja folderu startowego&lt;/h3&gt;

&lt;p&gt;Po nawiązaniu połączenia z serwerem raportów czyścimy uprawnienia głównego katalogu, w ramach którego będziemy tworzyć foldery i wgrywać raporty.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&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;"&gt;Create-Policy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&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;WAW-RS\ReportUser&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;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetPolicies(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$root&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;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Funkcja &lt;span style="color:#5f9ea0;"&gt;Create-Policy&lt;/span&gt; na podstawie przekazanych tablic zawierających łańcuchy z nazwami uprawnień tworzy odpowiednią kolekcję obiektów, którą możemy przekazać do usługi sieciowej &lt;strong&gt;SetPolicies&lt;/strong&gt;. Zmienna &lt;span style="color:#800080;"&gt;$adminGroups&lt;/span&gt; zawiera minimalne uprawnienia administratora:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&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;BUILTIN\Administrators&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;jeśli system, na którym uruchamiamy skrypt jest w angielskiej wersji językowej lub:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&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;BUILTIN\Administratorzy&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;jeśli system jest w polskiej wersji językowej. W powyższym przykładzie do metody &lt;span style="color:#5f9ea0;"&gt;Create-Policy&lt;/span&gt; przekazujemy również uprawnienia do przeglądania raportów dla użytkownika &lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WAW-RS\ReportUser&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;. Serwer raportów może bowiem zawierać raporty dla innych aplikacji webowych, których nie będziemy konfigurować. Ważne jest, aby uprawnienia przekazywane do funkcji &lt;span style="color:#5f9ea0;"&gt;Create-Policy&lt;/span&gt; w skrypcie podawać zawsze z nazwą komputera!&lt;/p&gt;

&lt;p&gt;Co natomiast robi funkcja &lt;span style="color:#5f9ea0;"&gt;Create-Policy&lt;/span&gt;? Oto jej kod:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Create-Policy&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;$adminGroups&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;$browseGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    {
        [Proxy.Policy[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&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;"&gt;Create-AdminPolicy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&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;$browseGroup&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:#800080;"&gt;$browseGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;){
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$role&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.Role&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;$role&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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Browser&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;$policy&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.Policy&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;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GroupUserName &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;$browseGroup&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Roles &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;$role&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&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;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Oraz kod metody &lt;span style="color:#5f9ea0;"&gt;Create-AdminPolicy&lt;/span&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Create-AdminPolicy&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;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    {
        [Proxy.Policy[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&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;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroup&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:#800080;"&gt;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;){
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$role&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.Role&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;$role&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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Content Manager&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;$policy&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.Policy&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;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GroupUserName &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;$adminGroup&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Roles &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;$role&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&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;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;W funkcjach &lt;span style="color:#5f9ea0;"&gt;Create-Policy&lt;/span&gt; oraz &lt;span style="color:#5f9ea0;"&gt;Create-AdminPolicy&lt;/span&gt; dokonuję pewnych założeń i uproszczeń. Otóż każdej grupie przekazanej przez zmienną &lt;span style="color:#800080;"&gt;$browseGroup&lt;/span&gt; przypisywane jest uprawnienie &lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Browser&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;. Usługi raportujące mają więcej w tej materii możliwości, ale ponieważ nie korzystam z nich nie są przeze mnie w&amp;#160; skrypcie obsługiwane.&lt;/p&gt;

&lt;h3&gt;Konfiguracja folderów i raportów&lt;/h3&gt;

&lt;p&gt;Proces konfiguracji będzie przebiegał według następującego schematu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Utworzenie jeśli konieczne folderu dla raportów; &lt;/li&gt;

  &lt;li&gt;Nadanie niezbędnych uprawnień do folderu; &lt;/li&gt;

  &lt;li&gt;Wgranie jeśli konieczne pliku rdl z definicją raportu; &lt;/li&gt;

  &lt;li&gt;Konfiguracja właściwości raportu; &lt;/li&gt;

  &lt;li&gt;Przypisanie źródła danych do raportu; &lt;/li&gt;

  &lt;li&gt;Konfiguracja uprawnień dostępu do raportu; &lt;/li&gt;

  &lt;li&gt;Dodanie do folderów nadrzędnych uprawnień koniecznych do dostępu do raportu. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykład załadowania i konfiguracji kilku kombinacji raportów:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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:#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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Konfigurowanie raportów przykładowych&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;$folder&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;Raporty przykładowe&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;$reportPath&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;$reportProjectFolder\Raporty przykładowe&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;$browseGroups&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;AD\Grupa1&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;AD\Grupa2&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;AD\Grupa3&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:#5f9ea0;"&gt;Create-Folder&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$root&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&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:#ff0000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Combine-Path&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$root&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    
    &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Report&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;$path&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;$reportPath\Raport 1.rdl&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;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$browseGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Report&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;$path&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;$reportPath\Raport 1 - podraport.rdl&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;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$browseGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$hide&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Report&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;$path&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;$reportPath\Raport 2.rdl&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;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$browseGroups&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;AD\Grupa4&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;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Report&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;$path&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;$reportPath\Raport 3.rdl&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;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$browseGroups&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;AD\Grupa4&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;AD\Grupa5&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;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Report&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;$path&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;$reportPath\Raport 4.rdl&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;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$browseGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$null&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Stała pomocnicza &lt;span style="color:#800080;"&gt;$hide&lt;/span&gt; zwraca wartość &lt;span style="color:#0000ff;"&gt;$true&lt;/span&gt; i podawana jako parametr funkcji &lt;span style="color:#5f9ea0;"&gt;Create-Report&lt;/span&gt; umożliwia ukrycie raportu.&lt;/p&gt;

&lt;p&gt;Po zdefiniowaniu wartości zmiennych zaczynamy od utworzenia i aktualizacji uprawnień folderu. Do tego wykorzystujemy metodę &lt;span style="color:#5f9ea0;"&gt;Create-Folder&lt;/span&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Create-Folder&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;$folder&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;$parent&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;/&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:#008080;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&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:#ff0000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Combine-Path&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folder&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:#ff0000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;ItemExists&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Utworzenie folderu $path&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;$properties&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;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CreateFolder(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$properties&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Usunięcie uprawnień dla folderu $path&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;$policies&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;"&gt;Create-AdminPolicy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetPolicies(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$path&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;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Dwie metody pomocnicze wywoływane przez funkcję &lt;span style="color:#5f9ea0;"&gt;Create-Folder&lt;/span&gt; to:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Combine-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;$path1&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;$path2&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:#ff0000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; [&lt;/span&gt;&lt;span style="color:#008080;"&gt;System.IO.Path&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;Combine&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$path1&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$path2&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&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;.Replace(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;\&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;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;umożliwiająca budowanie poprawnych ścieżek dostępu, oraz &lt;span style="color:#5f9ea0;"&gt;ItemExists&lt;/span&gt;, której zadaniem jest sprawdzenie czy w danej lokalizacji istnieje szukany przez nas element: folder, raport, źródło danych...&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;ItemExists&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;$folder&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;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    {
        [Proxy.BooleanOperatorEnum] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$operator&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;span style="color:#000000;"&gt;
        [Proxy.ConditionEnum] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$condition&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;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$searchCondition&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.SearchCondition&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;$searchCondition&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Condition &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;$condition&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$searchCondition&lt;/span&gt;&lt;span style="color:#000000;"&gt;.ConditionSpecified &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;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$searchCondition&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:#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:#800080;"&gt;$searchCondition&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Value &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;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        [Proxy.CatalogItem[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$items&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;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.FindItems(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$folder&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$operator&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$searchCondition&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$items&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;$items&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;-cgt&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Największe jednak czynności są wykonywane w czasie wgrywania i konfigurowania konkretnego raportu:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Create-Report&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;$parent&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;$adminGroups&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;$browseGroups&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;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$hide&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;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$overwrite&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;$false&lt;/span&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:#800080;"&gt;$name&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.IO.Path&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;GetFileNameWithoutExtension&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:#800080;"&gt;$report&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;$parent/$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:#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;$overwrite&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:#ff0000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;ItemExists&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;)){
                &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Upload-Report&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&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:#800080;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$overwrite&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            }
        }
        
        &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Set-ReportProperty&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$hide&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Set-ReportReferenceDataSource&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        [Proxy.Policy[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&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;"&gt;Create-Policy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$adminGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$browseGroups&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Set-ReportPolicy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;Set-FolderPolicy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Domyślnie jeśli dany raport już istnieje to nie jest aktualizowana jego definicja. Poprzez modyfikację wartości domyślnej dla parametru &lt;span style="color:#800080;"&gt;$overwrite&lt;/span&gt; możemy zmienić zachowanie skryptu. Pamiętajmy, iż nie należy usuwać raportów w celu modyfikacji definicji aby nie stracić istniejących historii i subskrypcji. Domyślne zachowanie skryptu jest takie, aby można było go uruchamiać w dowolnym (no prawie) momencie w celu sprawdzenia i korekcji uprawnień.&lt;/p&gt;

&lt;p&gt;Funkcja wgrywająca definicję raportu wygląda zaś następująco:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Upload-Report&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;$parent&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;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;, [&lt;/span&gt;&lt;span style="color:#008080;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$overwrite&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Utworzenie raportu $report&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;$stream&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.IO.File&lt;/span&gt;&lt;span style="color:#000000;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;OpenRead&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:#800080;"&gt;$definition&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;byte&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Read(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$definition&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &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;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length)
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$stream&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Close()        
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.CreateReport(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;, 
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$overwrite&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$definition&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Jak widzimy ułatwiamy sobie życie korzystając z bibliotek platformy .NET!&lt;/p&gt;

&lt;p&gt;Właściwości, które ustawiamy są skromne.W chwili obecnej jest to jedynie ukrywanie raportu. Ma to sens na przykład w przypadku podraportów, które nie stanowią jednocześnie samodzielnego raportu:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Set-ReportProperty&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;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt;, [&lt;/span&gt;&lt;span style="color:#008080;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$hidden&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Aktualizacja właściwości raportu $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:#800080;"&gt;$property&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.Property&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;$property&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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hidden&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;$property&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Value &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;$hidden&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$properties&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;$property&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetProperties(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$properties&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Po ustawieniu właściwości następuje przypisanie źródła danych do raportu. Oczywiście nie każdy raport musi posiadać źródło danych. Stąd warunek na początku funkcji:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Set-ReportReferenceDataSource&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;$report&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;$dataSourceReferenceName&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;$dataSourceReferenceName&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;$null&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;-or&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;-lt&lt;/span&gt;&lt;span style="color:#000000;"&gt; &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:#0000ff;"&gt;return&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Aktualizacja źródła danych raportu $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:#800080;"&gt;$dataSourceReference&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Proxy.DataSourceReference&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;$dataSourceReference&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Reference &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;$dataSourceReferenceName&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSources&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;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GetItemDataSources(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&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; Poniższe można odkomentować jeśli nie zależy nam na poprawności&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:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt; przypisań źródła danych&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:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;if($dataSources -eq $null){&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:#008000;"&gt;#&lt;/span&gt;&lt;span style="color:#008000;"&gt;    return&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:#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;$dataSource&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:#800080;"&gt;$dataSources&lt;/span&gt;&lt;span style="color:#000000;"&gt;){
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSource&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Item &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;$dataSourceReference&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetItemDataSources(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$dataSources&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;W powyższym kodzie dokonuję kilku ważnych założeń. Po pierwsze jak już wcześniej mówiłem, zakładam, iż źródła danych w ramach usług raportowych są już utworzone. Dlatego też stosuję typ &lt;span style="color:#800000;"&gt;Proxy.DataSourceReference&lt;/span&gt;. Po drugie każdy raport korzysta docelowo tylko z jednego źródła danych. Nawet jeśli w czasie tworzenia raportu i jego testów wykorzystywałem dwa czy trzy źródła danych to na serwerze produkcyjnym mam tylko jedno źródło. Jeśli to założenie w Waszym przypadku nie będzie prawdziwe należy dokonać modyfikacji funkcji &lt;span style="color:#5f9ea0;"&gt;Set-ReportReferenceDataSource&lt;/span&gt; tak, aby parametr &lt;span style="color:#800080;"&gt;$dataSourceReferenceName&lt;/span&gt; był tablicą.&lt;/p&gt;

&lt;p&gt;Przypisanie uprawnień do raportu:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Set-ReportPolicy&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;$report&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;$name&lt;/span&gt;&lt;span style="color:#000000;"&gt;, 
        [Proxy.Policy[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Nadanie uprawnień do raportu $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:#800080;"&gt;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetPolicies(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$report&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;I na koniec rekurencyjne ustawienia właściwości folderu zawierającego konfigurowany raport. Znak &lt;span style="color:#5f9ea0;font-weight:bold;"&gt;%&lt;/span&gt; jest skrótowym zapisem polecenia &lt;span style="color:#5f9ea0;font-weight:bold;"&gt;Foreach-Object&lt;/span&gt;:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;pre&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;Set-FolderPolicy&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;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        [Proxy.Policy[]] &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
    {        
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folderPolicies&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;$folderPoliciesInherited&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;ref&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;$false&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folderPolicies&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;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GetPolicies(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
            &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folderPoliciesInherited&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;$policy&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:#800080;"&gt;$policies&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;$folderPolicies&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;.GroupUserName}) &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;-notcontains&lt;/span&gt;&lt;span style="color:#000000;"&gt; 
                    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.GroupUserName){
                &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folderPolicies&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;$policy&lt;/span&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;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Aktualizacja uprawnień folderu $parent&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;$global:proxy&lt;/span&gt;&lt;span style="color:#000000;"&gt;.SetPolicies(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;span style="color:#800080;"&gt;$folderPolicies&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;$parent&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;$global:root&lt;/span&gt;&lt;span style="color:#000000;"&gt;){
            &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt;
        }
        
        &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&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;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length; &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;$i&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;$parent&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&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:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;/&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;$newParent&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;$parent&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;$i&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;$newParent&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Length &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;span style="color:#000000;"&gt;){
                    &lt;/span&gt;&lt;span style="color:#800080;"&gt;$newParent&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;/&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:#5f9ea0;"&gt;Set-FolderPolicy&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$newParent&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$policies&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;
            }
        }
    }&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pamiętajmy o bardzo ważnym fakcie – uprawnienia folderu zawierający podfoldery i raporty są sumą uprawnień podfolderów i raportów!&lt;/p&gt;

&lt;h3&gt;Zakończenie&lt;/h3&gt;

&lt;p&gt;Uzbrojeni w taki skrypt możemy spokojnie wypłynąć na szerokie wody konfiguracyjne usług raportowych. Jedyne problemy jakie mogą nas spotkać dotyczyć będą sytuacji, kiedy będziemy próbowali skorzystać z protokołu https przy braku zaufanego certyfikatu. Nie ma bowiem możliwości potwierdzenia świadomego łączenia się z serwerem.&lt;/p&gt;

&lt;p&gt;Osobom, które chciałyby spróbować swoich sił w wykorzystaniu języka PowerShell polecam pobranie darmowego &lt;a title="PowerGUI" href="http://www.powergui.org/" target="_blank"&gt;PowerGUI&lt;/a&gt; umożliwiającego pisanie skryptów oraz zarządzanie (!) komputerem i nie tylko przy pomocy hierarchicznie zorganizowanych skryptów PowerShell. Warto również z sekcji &lt;a title="PowerPacks" href="http://www.powergui.org/kbcategory.jspa?categoryID=21" target="_blank"&gt;PowerPacks&lt;/a&gt; pobrać pakiet &lt;a title="SQL Server 2005 Reporting Services Power Pack" href="http://www.powergui.org/entry.jspa?externalID=2045&amp;amp;categoryID=54" target="_blank"&gt;SQL Server 2005 Reporting Services Power Pack&lt;/a&gt; umożliwiający zarządzanie usługami raportującymi.&lt;/p&gt;

&lt;p&gt;Grafika (schemat folderów) została wykonana przy pomocy &lt;a title="Brainstorm online" href="http://www.bubbl.us/" target="_blank"&gt;bubbl.us&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=2938" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Reporting Services" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Reporting+Services/default.aspx" /><category term="PowerShell" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/PowerShell/default.aspx" /></entry><entry><title>Implementacja Inversion of Control - wersja 1.1</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/01/27/implementacja-inversion-of-control-wersja-1-1.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2009/01/27/implementacja-inversion-of-control-wersja-1-1.aspx</id><published>2009-01-27T11:38:07Z</published><updated>2009-01-27T11:38:07Z</updated><content type="html">&lt;p&gt;Od &lt;a title="Implementacja Inversion of Control" target="_blank" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/08/24/implementacja-inversion-of-control.aspx"&gt;ostatniej notki&lt;/a&gt; opisującej wykorzystywany przeze mnie własnej produkcji kontener IoC wprowadziłem kilka modyfikacji czyniących rozwiązanie bardziej elastycznym, ale wciąż pozostające wierne podstawowym założeniom:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Wydajne i łatwe w użyciu; &lt;/li&gt;    &lt;li&gt;Zminimalizowane użycie refleksji; &lt;/li&gt;    &lt;li&gt;Brak plik&amp;#243;w konfiguracyjnych. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Czymże jest kontener IoC&lt;/h3&gt;  &lt;p&gt;Kontener IoC umożliwia programiście wprowadzenie w aplikacji luźnych powiązań pomiędzy obiektami. Programista rejestruje interfejsy i klasy abstrakcyjne wraz z typami implementującymi, instancjami lub procedurami tworzącymi instancje klas na żądanie:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.Register&amp;lt;&lt;span style="color:#2b91af;"&gt;IContactRepository&lt;/span&gt;&amp;gt;().&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WithType&amp;lt;&lt;span style="color:#2b91af;"&gt;ContactRepository&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Możliwa jest r&amp;#243;wnież rejestracja typ&amp;#243;w, kt&amp;#243;re mogą posiadać instancje:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.Register&amp;lt;&lt;span style="color:#2b91af;"&gt;Database&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Zwracany w czasie rejestracji interfejs &lt;font color="#2b91af"&gt;IObjectProfile&lt;/font&gt; korzysta ze wzorca &lt;strong&gt;Fluent Interface&lt;/strong&gt; w celu właściwej konfiguracji:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.Register&amp;lt;&lt;span style="color:#2b91af;"&gt;IContactRepository&lt;/span&gt;&amp;gt;().&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AsSingleton().&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WithType&amp;lt;&lt;span style="color:#2b91af;"&gt;ContactRepository&lt;/span&gt;&amp;gt;().&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AndBuildUp(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Skorzystanie z obiektu zarejestrowanego w kontenerze polega na wywołaniu metody &lt;strong&gt;GetInstance&lt;/strong&gt; z ewentualnymi parametrami, kt&amp;#243;re zostaną przekazane do konstruktora:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; repository = &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.GetInstance&amp;lt;&lt;span style="color:#2b91af;"&gt;IContactRepository&lt;/span&gt;&amp;gt;();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;W przeciwieństwie do rozwiązań typu &lt;strong&gt;Dependency Injection&lt;/strong&gt; w opisywanym kontenerze IoC nie jest możliwe skorzystanie z automatycznego uzupełniania parametr&amp;#243;w konstruktor&amp;#243;w czy wstrzykiwania instancji do właściwości.&lt;/p&gt;  &lt;h3&gt;Zmiany&lt;/h3&gt;  &lt;p&gt;W por&amp;#243;wnaniu do wersji wcześniejszej, fasada rozwiązania, statyczna od teraz klasa &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt; zwraca nam zamiast obiektu &lt;font color="#2b91af"&gt;ObjectProfile&lt;/font&gt; interfejs &lt;font color="#2b91af"&gt;IObjectProfile&lt;/font&gt;. Z punktu widzenia programisty korzystającego z IoC jest to najważniejsza zmiana. Może to bowiem oznaczać konieczność zmiany między innymi definicji metod zwrotnych wywoływanych w czasie tworzenia instancji, jeśli oczywiście z takowych korzystamy, na:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IObjectProfile&lt;/span&gt;&amp;lt;TRegisteredAs&amp;gt;, TRegisteredAs&amp;gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;oraz&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IObjectProfile&lt;/span&gt;&amp;lt;TRegisteredAs&amp;gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;[], TRegisteredAs&amp;gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Są to jednak zmiany na poziomie wręcz kosmetycznym. Jednym słowem nie sprawią problem&amp;#243;w.&lt;/p&gt;  &lt;p&gt;Wewnętrznie &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt; deleguje teraz wszystkie zadania do implementacji interfejsu &lt;font color="#2b91af"&gt;IObjectContainer&lt;/font&gt;. Dzięki temu korzystanie z &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt; nie determinuje nam konkretnej implementacji kontenera. Innymi słowy wykorzystanie tego rozwiązania nie przekreśla możliwości skorzystania z innego rozwiązania &lt;strong&gt;Inversion of Control&lt;/strong&gt; lub nawet &lt;strong&gt;Dependency Injection&lt;/strong&gt;. Wystarczy bowiem w&amp;#243;wczas zaimplementować interfejs &lt;font color="#2b91af"&gt;IObjectProfile&lt;/font&gt; w celu konfiguracji rejestrowanego typu oraz interfejs &lt;font color="#2b91af"&gt;IObjectContainer&lt;/font&gt; do zarządzania rejestrowanymi typami. Podmiana kontenera oznacza przypisanie klasie &lt;font color="#2b91af"&gt;ObjectLocator &lt;/font&gt;poprzez właściwość &lt;strong&gt;Container&lt;/strong&gt; interesującej nas instancji implementującej &lt;font color="#2b91af"&gt;IObjectContainer&lt;/font&gt;.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img alt="Implementacja Inversion of Control" src="http://zine.net.pl/photos/posts_pictures/images/2784/original.aspx" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;Implementacja Inversion of Control&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Dzięki wprowadzeniu interfejsu &lt;font color="#2b91af"&gt;IObjectContainer&lt;/font&gt; prostsze stało się korzystanie z kontenera w pakietach (&lt;strong&gt;assemblies&lt;/strong&gt;) zewnętrznych. Do tej pory pobieranie instancji oznaczało konieczność odwoływania się do statycznej klasy &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt;. Teraz wystarczy przekazać do pakietu zewnętrznego zmienną typu &lt;font color="#2b91af"&gt;IObjectContainer&lt;/font&gt;. &lt;/p&gt;  &lt;p&gt;Łatwiejsze stało się r&amp;#243;wnież testowanie aplikacji korzystających z rozwiązania IoC. Nie trzeba teraz przed każdym testem konfigurować klasy &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt; poprzez rejestrowanie typ&amp;#243;w etc. Zamiast tego wystarczy obecnie przypisać do właściwości &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt;&lt;strong&gt;.Container&lt;/strong&gt; testową implementację kontenera. Poniżej przykład takiego kodu wykorzystującego bibliotekę &lt;a title="Rhino.Mocks" target="_blank" href="http://ayende.com/projects/rhino-mocks.aspx"&gt;Rhino.Mocks&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; container = &lt;span style="color:#2b91af;"&gt;MockRepository&lt;/span&gt;.GenerateStub&amp;lt;&lt;span style="color:#2b91af;"&gt;IObjectContainer&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; repository = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CustomerRepository&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; container.Stub(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x =&amp;gt; x.GetInstance&amp;lt;&lt;span style="color:#2b91af;"&gt;IRepository&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;&amp;gt;()).&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Return(repository);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.Container = container;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; repository,&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.GetInstance&amp;lt;&lt;span style="color:#2b91af;"&gt;IRepository&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt;&amp;gt;());&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Nowości&lt;/h3&gt;  &lt;p&gt;Poza opisaną już właściwością &lt;strong&gt;Container&lt;/strong&gt;, w klasie &lt;font color="#2b91af"&gt;ObjectLocator&lt;/font&gt; i interfejsie &lt;font color="#2b91af"&gt;IObjectContainer&lt;/font&gt; pojawiła się metoda &lt;strong&gt;Contains&lt;/strong&gt; umożliwiająca sprawdzenie czy dany typ został już zarejestrowany. Jest to cenna możliwość zwłaszcza jeśli potrzebujemy dla danego odbiorcy (użytkownika) oprogramowania przerejestrować konkretny typ. W wersji wcześniejszej konieczne było sprawdzenie czy istnieje profil dla danego typu wykorzystując metodę &lt;strong&gt;GetProfile&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Na poziomie konfigurowania typu (interfejs &lt;font color="#2b91af"&gt;IObjectProfile&lt;/font&gt;) dodano możliwość zarejestrowania parametr&amp;#243;w domyślnych przekazywanych do konstruktora nowego obiektu. W poniższym przykładzie parametr ten jest pobierany z kontenera IoC:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.Register&amp;lt;&lt;span style="color:#2b91af;"&gt;IContactRepository&lt;/span&gt;&amp;gt;().&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WithType&amp;lt;&lt;span style="color:#2b91af;"&gt;ContactRepository&lt;/span&gt;&amp;gt;().&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WithParameters(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt;[]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ObjectLocator&lt;/span&gt;.GetInstance&amp;lt;&lt;span style="color:#2b91af;"&gt;Database&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }).&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AsSingleCall();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Parametry domyślne mogą być zastępowane nowymi w czasie wywołań metody &lt;strong&gt;GetInstance&lt;/strong&gt;.&lt;/p&gt;  &lt;h3&gt;Podsumowanie&lt;/h3&gt;  &lt;p&gt;Opisywane rozwiązania używam z powodzeniem od ponad kilkunastu miesięcy w &lt;a title="Rozwiązanie mobilne" target="_blank" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/12/11/rozwi-zanie-mobilne.aspx"&gt;projekcie&lt;/a&gt;, kt&amp;#243;rego części składowe działają na urządzeniach mobilnych. Udostępnione kody są oparte na nowej licencji BSD co umożliwia używanie opisywanego kontenera IoC w projektach komercyjnych. Kody źr&amp;#243;dłowe zawierają testy jednostkowe, kt&amp;#243;re umożliwiają dokładniejsze zapoznanie się z możliwościami rozwiązania.&lt;/p&gt;  &lt;p&gt;Pliki do artykułu:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="IoC" target="_blank" href="http://zine.net.pl/files/folders/2795/download.aspx"&gt;IoC&lt;/a&gt; - kody źr&amp;#243;dłowe. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=2796" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Metodyka" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Metodyka/default.aspx" /><category term="Wzorce projektowe" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Wzorce+projektowe/default.aspx" /><category term=".NET" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/.NET/default.aspx" /><category term=".NET Compact Framework" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/.NET+Compact+Framework/default.aspx" /><category term="Mobilne" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Mobilne/default.aspx" /><category term="Rozwiązanie mobilne" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Rozwi_0501_zanie+mobilne/default.aspx" /></entry><entry><title>Reporting Services - projekt(y) po polsku?</title><link rel="alternate" type="text/html" href="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/12/16/reporting-services-projekt-y-po-polsku.aspx" /><id>http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/2008/12/16/reporting-services-projekt-y-po-polsku.aspx</id><published>2008-12-16T14:53:15Z</published><updated>2008-12-16T14:53:15Z</updated><content type="html">&lt;p&gt;Kiedy ponad rok temu zaczynałem budowanie raport&amp;#243;w w MS SQL Server 2005 Reporting Services podszedłem do tematu jak rasowy programista. Całe nazewnictwo miało być po angielsku.&lt;/p&gt;  &lt;h3&gt;Etap pierwszy&lt;/h3&gt;  &lt;p&gt;Założyłem nowy projekt, dodałem do repozytorium (usługi raportowe były nowe, nowiuśkie, bez jakiegokolwiek raportu) i... hm.... Pierwsza niespodzianka to siermiężne warunki przygotowywania zapytań w Visual Studio. Nie będę się rozpisywał. Budowanie zapytań SQL w tym środowisku ma swoje ograniczenia (ma się ochotę przejść na ciemną stronę mocy).&lt;/p&gt;  &lt;h3&gt;Etap drugi&lt;/h3&gt;  &lt;p&gt;Chciał nie chciał, ale powstał skorelowany z raportami drugi projekt przeznaczony dla Microsoft SQL Server Management Studio. Teraz życie uległo poprawie. W Management Studio powstawało zapytanie, lub zapytania jeśli raport miał zawierać parametry w postaci rozwijalnych list, i testy poprawności zwracanych danych. W Visual Studio zaś wygląd raportu. Zapytanie było przekopiowywane (Ctrl+C, Ctrl+V).&lt;/p&gt;  &lt;h3&gt;Etap trzeci&lt;/h3&gt;  &lt;p&gt;Raport&amp;#243;w przybywa. Nazewnictwo specjalistyczne doprowadza przy tłumaczeniach do szału. W ramach samej usługi dostępnej poprzez stronę WWW raporty te występują pod polskimi nazwami, co jest słuszne - w końcu pracuję w polskiej firmie. Problemy zaczynają sprawiać łączenia raport&amp;#243;w (budowanie odnośnik&amp;#243;w w jednych raportach do drugich). Zaczynam się irytować.&lt;/p&gt;  &lt;h3&gt;Etap czwarty&lt;/h3&gt;  &lt;p&gt;Nazwy wszystkich plik&amp;#243;w zawierających zapytania SQL oraz definicje raport&amp;#243;w zostały przetłumaczone na polski. Powr&amp;#243;t do macierzy. Trochę to jeszcze drażni ale tak jest zdecydowanie lepiej. Nie ma oznak paniki. Łatwo znaleźć raport, o kt&amp;#243;ry właściciel biznesowy się dopytuje.&lt;/p&gt;  &lt;p&gt;W miarę powstawania kolejnych raport&amp;#243;w coraz więcej os&amp;#243;b pr&amp;#243;buje wykorzystać platformę raportową w celu ułatwienia sobie codziennej pracy. Ponieważ zapytania są budowane na relacyjnej bazie danych ich rozmiar staje się coraz większy i większy.... aż pewnego dnia Visual Studio m&amp;#243;wi stop! Przekroczyłem limit 32 KB znak&amp;#243;w w zapytaniu. Coś podobnego. Usunięcie komentarzy pomogło.&lt;/p&gt;  &lt;p&gt;Zdarza się r&amp;#243;wnież, iż zmieni się logika biznesowa (czytaj znaczenie p&amp;#243;l w tabelach) albo zleceniodawca raportu ma fanaberie i trzeba kt&amp;#243;reś z p&amp;#243;l trochę inaczej przeliczyć. Zmiana zapytania, przekopiowanie zapytania do raportu, połączenie się poprzez RDP z serwerem, wgranie raportu.... Ta ścieżka zaczyna być zbyt nużąca.&lt;/p&gt;  &lt;h3&gt;Etap piąty&lt;/h3&gt;  &lt;p&gt;Kocham procedury składowane. Wszystko składuję teraz w nich (no bez przesady. Własne funkcje i procedury do pomocniczych obliczeń używałem od samego początku). Całe zapytania. Raport wywołuje procedurę i tyle. Żadnego kopiowania. Jeśli pojawia się zmiana obliczania p&amp;#243;l, kt&amp;#243;re nie skutkuje modyfikacją raportu to wystarczy zmienić tylko procedurę. Bez konieczności modyfikowania zapytania w definicji raportu.&lt;/p&gt;  &lt;p&gt;Oczywiście procedury mają polskie nazwy. I tak zostanie.&lt;/p&gt;&lt;img src="http://zine.net.pl/aggbug.aspx?PostID=2632" width="1" height="1"&gt;</content><author><name>arkadiusz.wasniewski</name><uri>http://zine.net.pl/members/arkadiusz.wasniewski.aspx</uri></author><category term="Metodyka" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Metodyka/default.aspx" /><category term="Visual Studio" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Visual+Studio/default.aspx" /><category term="Reporting Services" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/Reporting+Services/default.aspx" /><category term="SQL Server" scheme="http://zine.net.pl/blogs/arkadiusz_wasniewski/archive/tags/SQL+Server/default.aspx" /></entry></feed>