Powershell получает внешнюю переменную в последовательности foreach - PullRequest
2 голосов
/ 12 января 2009
    PS C:\Projects> 
    get-childitem  -recurse 
 |  where { $_.Extension -eq ".csproj" }
 | foreach { Get-Content $_.FullName 
          | foreach { $_.Length } }

Это печатает размер строки каждой строки в csproj (правда, бессмысленно). Как я могу также вывести внешнюю переменную (так сказать), когда я нырнул дальше. Например, по понятным причинам я хотел, чтобы он тоже напечатал имя файла, чтобы я получил:

Dog.csproj: 10 Dog.csproj: 50 Dog.csproj: 4 Cat.csproj: 100 Cat.csproj: 440

Я полагаю, что я хочу сделать что-то подобное, но это, очевидно, не работает (и да, пример не имеет смысла)

  PS C:\Projects> 
        get-childitem  -recurse 
     |  STORE THIS IN $filename | where { $_.Extension -eq ".csproj" }
     | foreach { Get-Content $_.FullName 
              | foreach { $filename ":"  $_.Length } }

Я играл с tee-object и outputvariable, но я немного растерялся. Если бы гуру PowerShell мог ответить, это помогло бы, также если бы вы могли порекомендовать книгу или ресурс, который объясняет основы синтаксиса языка, а не материал об обезьянах API COM / WMI / VB и т. Д. будет наиболее ценится. Спасибо

Ответы [ 3 ]

4 голосов
/ 13 января 2009

Это простой способ:

`gci . -r "*.csproj" | % { $name = $_.name; gc $_.fullname |
         % { $name + ": " + $_.length }  }`

Если вы еще не знаете аббревиатуры, это эквивалентно:

`Get-ChildItem . -recurse "*.csproj" | 
      foreach { $name = $_.name; Get-Content $_.fullname | 
      foreach { $name + ": " + $_.length }  }`

Что касается рекомендации по книге, то это должна быть книга Брюса Пайетта: http://www.amazon.com/Windows-PowerShell-Action-Bruce-Payette/dp/1932394907

Mike

0 голосов
/ 12 января 2009

Как насчет:

dir -r -fo * .csproj | select @ {n = "FileName"; e = {$ .FullName}}, @ {n = "LineLong"; e = {cat $ .fullName | foreach {$ _. length}}}

0 голосов
/ 12 января 2009

get-childitem -recurse -filter * .csproj | select @ {n = "FileName"; e = {$ .FullName}}, @ {n = "Lines"; e = {$ (cat $ .FullName) .count}}

Это дает вывод как:

FileName Lines -------- ---------- D: \ Scripts \ test1.csproj 867 D: \ Scripts \ test2.csproj 1773

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...