{"id":1170,"date":"2019-06-25T19:06:26","date_gmt":"2019-06-25T22:06:26","guid":{"rendered":"http:\/\/thesqltimes.com\/blog\/?p=1170"},"modified":"2019-06-25T19:06:26","modified_gmt":"2019-06-25T22:06:26","slug":"dba-shell-2","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2019\/06\/25\/dba-shell-2\/","title":{"rendered":"DBA Shell 2: Obtendo mais informa\u00e7\u00f5es sobre arquivos"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Muito \u00fatil!\" data-post-id=\"1170\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div><div class=\"seriesmeta\">Post 2\/3. Este post \u00e9 parte da s\u00e9rie: <a href=\"https:\/\/thesqltimes.com\/blog\/series\/dba-shell\/\" class=\"series-247\" title=\"DBA Shell\">DBA Shell<\/a>\r\n<\/div>\r\n<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de Leitura:<\/span> <span class=\"rt-time\"> 3<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>V\u00e3o existir muitas situa\u00e7\u00f5es em que voc\u00ea ir\u00e1 precisar analisar informa\u00e7\u00f5es de um arquivo, como a data de cria\u00e7\u00e3o, tamanho, etc.\u00a0 Para fazer isso com powershell \u00e9 muito simples:<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"Obtendo informa\u00e7\u00f5es de arquivos\">Get-ChildItem C:\\SQLBackups\\*.bak<\/pre>\n<p>Este comando \u00e9 muito parecido com o <a href=\"http:\/\/thesqltimes.com\/blog\/2019\/05\/28\/dba-shell-1\/\">j\u00e1 conhecido Remove-Item<\/a>. Os par\u00e2metros s\u00e3o semelhantes. Ele espera um caminho. S\u00f3 que ao inv\u00e9s de remover arquivos, ele lista algumas informa\u00e7\u00f5es padr\u00f5es dos mesmos:<\/p>\n<p id=\"TdqRvYd\"><img loading=\"lazy\" decoding=\"async\" width=\"813\" height=\"399\" class=\"alignnone size-full wp-image-1174 \" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffa82f3d81.png\" alt=\"\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffa82f3d81.png 813w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffa82f3d81-300x147.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffa82f3d81-768x377.png 768w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><\/p>\n<p>No powershell, os comandos retornam <strong>objetos<\/strong>. Objetos vem do conceito da orienta\u00e7\u00e3o a objetos e precisar\u00edamos de uma s\u00e9rie exclusiva s\u00f3 pra explicar. Ao inv\u00e9s disso, vamos aprendendo com calma, com exemplos mais pr\u00e1ticos.<\/p>\n<p>Basicamente, os objetos s\u00e3o representa\u00e7\u00f5es de alguma coisa, e eles possuem uma s\u00e9rie de propriedades, que s\u00e3o valores que conseguimos acessar atrav\u00e9s de um nome.<\/p>\n<p>O comando <strong><em>Get-ChildItem<\/em><\/strong> retorna uma lista com um ou mais objetos, que, dependendo dos par\u00e2metros passados, podem ser arquivos, diret\u00f3rios, chaves do registros, bancos sql, etc. Quando o resultado de um cmdlet \u00e9 enviado para a tela, o powershell formata e exibe algumas propriedades por padr\u00e3o (a formata\u00e7\u00e3o e as propriedades exibidas podem ser alteradas em arquivos de configura\u00e7\u00e3o).<\/p>\n<p>No caso do <strong><em>Get-ChildItem<\/em><\/strong>, ele exibe o nome do arquivo, tamanho, e algumas outras informa\u00e7\u00f5es. Voc\u00ea pode utilizar o cmdlet <a href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.utility\/select-object?view=powershell-6\">Select-Object<\/a> para escolher quais as propriedades retornadas<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Utilizando Select-Object\">Get-ChildItem C:\\SQLBackups\\*.bak | Select-Object Name<\/pre>\n<p>Vamos com calma:<\/p>\n<ul>\n<li>Get-ChildItem C:\\SQLBackups\\*.bak<br \/>\nRetorna uma lista de objetos, cada um representando os arquivos <em>bak<\/em> que est\u00e3o em<strong><strong> C:\\SQLBackups<\/strong><\/strong><\/li>\n<li>|<br \/>\nO pipe \u00e9 utilizado para conectar o resultado de<em><strong> Get-ChildItem<\/strong><\/em> com o <em><strong>Select-Object<\/strong><\/em>. Assim, ao inv\u00e9s de jogar pra tela, cada objeto resultante de <strong><em>Get-ChildItem<\/em><\/strong> \u00e9 enviado para o pr\u00f3ximo comando, e esse pr\u00f3ximo comando far\u00e1 o que quiser com esses objetos. Um conjunto de dois ou mais comandos conectados pelo pipe \u00e9 chamado de pipeline.<\/li>\n<li>Select-Object Name<br \/>\nO cmdlet <strong>Select-Object<\/strong> \u00e9\u00a0 usado para escolher quais propriedades dos objetos ser\u00e3o retornadas. N\u00f3s especificamos o nome das propriedades atrav\u00e9s de par\u00e2metros. No caso, Select-Object ir\u00e1 escolher as propriedades dos objetos resultantes de <strong>Get-ChildItem<\/strong>, que representam arquivos. O valor que passamos foi <em><strong>Name<\/strong><\/em>, que indica que estamos dizendo ao <strong><em>Select-Object<\/em><\/strong> que somente retorne a propriedade <strong><em>Name<\/em> <\/strong>desses objetos, cujo o valor <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.io.fileinfo?view=netframework-4.8#properties\">cont\u00e9m o nome e extens\u00e3o do arquivo.<\/a><\/li>\n<\/ul>\n<p>H\u00e1 diversas propriedades existentes. Por exemplo, o seguinte comando nos retorna o<a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.io.filesysteminfo.fullname?view=netframework-4.8#System_IO_FileSystemInfo_FullName\"> nome completo do arquivo<\/a>, e a <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.io.filesysteminfo.creationtime?view=netframework-4.8#System_IO_FileSystemInfo_CreationTime\">data de cria\u00e7\u00e3o<\/a>:<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Obtendo caminho completo e data de cria\u00e7\u00e3o do arquivo\">Get-ChildItem C:\\SQLBackups\\*.bak | Select-Object FullName,CreationTime<\/pre>\n<p id=\"torcBMj\"><img loading=\"lazy\" decoding=\"async\" width=\"896\" height=\"312\" class=\"alignnone size-full wp-image-1175 \" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc5272607.png\" alt=\"\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc5272607.png 896w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc5272607-300x104.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc5272607-768x267.png 768w\" sizes=\"auto, (max-width: 896px) 100vw, 896px\" \/><\/p>\n<p>Perceba como eu espec\u00edfico mais de uma propriedade: Separando por v\u00edrgulas. No powershell, a v\u00edrgula tem um significado especial e teremos outras oportunidades de explor\u00e1-la melhor. Por enquanto, apenas entenda que ela \u00e9 usada para especificar v\u00e1rios valores!<\/p>\n<p>J\u00e1 o seguinte exemplo retorna somente o <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.io.fileinfo.name?view=netframework-4.8#System_IO_FileInfo_Name\">nome do arquivo<\/a>, o <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.io.fileinfo.length?view=netframework-4.8#System_IO_FileInfo_Length\">tamanho em bytes<\/a>, e a <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.io.filesysteminfo.lastwritetime?view=netframework-4.8#System_IO_FileSystemInfo_LastWriteTime\">data de modifica\u00e7\u00e3o<\/a>:<\/p>\n<pre class=\"lang:ps decode:true\" title=\"Obtendo nome, tamanho e data de modifica\u00e7\u00e3o dos arquivos\">gci C:\\SQLBackups\\*.bak | select Name,Length,LastWriteTime<\/pre>\n<p id=\"RYYEBRo\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"294\" class=\"alignnone size-full wp-image-1176 \" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc6f5bd67.png\" alt=\"\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc6f5bd67.png 730w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/06\/img_5d0ffc6f5bd67-300x121.png 300w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/p>\n<p>Aqui eu tomei a liberdade de usar os alias: <strong>gci<\/strong> para <strong>Get-ChildItem<\/strong> e <strong>select<\/strong> para <strong>Select-Object<\/strong>. No mais, apenas troquei os par\u00e2metros\u00a0 passados para o Select-Object.<\/p>\n<p>Uma pergunta que voc\u00ea pode estar se fazendo \u00e9: <strong>Como eu sei quais propriedades os objetos ter\u00e3o e o que elas significam? <\/strong>A resposta \u00e9 simples: Com experi\u00eancia, outros cmdlets, e documenta\u00e7\u00e3o. Existem v\u00e1rias maneiras de se descobrir isso. Vamos explorar tudo ao longo dos outros posts desta s\u00e9rie.<\/p>\n<p>Para simplificar:<\/p>\n<ul>\n<li>Obter uma lista de arquivos de um diret\u00f3rio (gci, ls, e dir s\u00e3o alias para Get-ChildItem)\n<pre class=\"lang:ps decode:true\">Get-Childitem &lt;Diretorio&gt;\ngci &lt;Diretorio&gt; \nls &lt;Diretorio&gt; \ndir &lt;Diretorio&gt;<\/pre>\n<\/li>\n<li>| (pipe) \u00e9 um operador usado para conectar o resultado de um comando com outro comando<\/li>\n<li>Pipeline \u00e9 uma sequ\u00eancia de comandos conectados pelo |<\/li>\n<li>Cmdlets retornam objetos. Objetos s\u00e3o a representa\u00e7\u00e3o de algo, como arquivos, diret\u00f3rios, etc.<\/li>\n<li>Todo objeto possuem propriedades. Propriedades s\u00e3o valores identificados por um nome que dizem algo sobre o objeto<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This entry is part 2 of 3 in the series <a href=\"https:\/\/thesqltimes.com\/blog\/series\/dba-shell\/\" class=\"series-247\" title=\"DBA Shell\">DBA Shell<\/a><\/div><p>V\u00e3o existir muitas situa\u00e7\u00f5es em que voc\u00ea ir\u00e1 precisar analisar informa\u00e7\u00f5es de um arquivo, como a data de cria\u00e7\u00e3o, tamanho, etc.\u00a0 Para fazer isso com powershell \u00e9 muito simples: Get-ChildItem C:\\SQLBackups\\*.bak Este comando \u00e9 muito parecido com o j\u00e1 conhecido Remove-Item. Os par\u00e2metros s\u00e3o semelhantes. Ele espera um caminho. S\u00f3 que ao inv\u00e9s de remover&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2019\/06\/25\/dba-shell-2\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">DBA Shell 2: Obtendo mais informa\u00e7\u00f5es sobre arquivos<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1172,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[95,1,93],"tags":[261,259,256,257,258,260,254,255,96,65,253,73],"series":[247],"class_list":["post-1170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell-windows","category-uncategorized","category-windows","tag-dir","tag-gci","tag-get-childitem","tag-listar-arquivos","tag-listar-backups","tag-ls","tag-pipe","tag-pipeline","tag-powershell","tag-select","tag-select-object","tag-sql-server","series-dba-shell"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/1170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/comments?post=1170"}],"version-history":[{"count":8,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/1170\/revisions"}],"predecessor-version":[{"id":1183,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/1170\/revisions\/1183"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media\/1172"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=1170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=1170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=1170"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=1170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}