2013-07-11 2 views
2

Я пытаюсь создать пакетный скрипт с PowerShell включен, но он не работает, как показано нижев PowerShell пакетный файл

@echo off 
rename D:\temp\*.csv temp.csv 
powershell.exe -Command "& {Import-Csv D:\temp\temp.csv | select ip,hostname | Export-Csv -Path D:\temp\temp01.csv –NoTypeInformation}" 
del /F /S /Q D:\temp\temp.csv 
powershell -command "& {Rename-Item D:\temp\temp01.csv D:\temp\temp.txt}" 
type D:\temp\temp.txt | findstr /v n/s | findstr /v n/a | findstr /v Hostname >> D:\temp\temp01.txt 
del /F /S /Q D:\temp\temp.txt 
rename D:\temp\temp01.txt temp.txt 
powershell -command "& {Rename-Item D:\temp\temp.txt dad.csv}" 
powershell -command "& {Get-Content D:\temp\dad.csv | where {$_ -match 'LWKS'} | Set-Content D:\temp\lwks.csv}" 
powershell -command "& {Get-Content D:\temp\dad.csv | where {$_ -match 'WKS'} | Set-Content D:\temp\wks.csv}" 
exit 

Но, он работал очень хорошо, если бы я запускать отдельные команды из выше пакетный скрипт с использованием cmd. Temp.csv можно найти here Спасибо за помощь.

+5

Как, собственно, сценарий не работает? – vonPryz

+0

Моя конечная цель: # 1, удалить столбцы с заголовком «Ping» и «Ports» + удалить строки, содержащие строку «[n/a]» и «[n/s]» «Hostname» в temp.csv файл >>> сохранить его в dad.csv # 2, в новом файле dad.csv удалить все строки, не содержащие «lwks» >>> save to lwks.csv, сделать то же самое с любой строкой, не содержащей «wks «>>> Сохраните его на wks.csv # 3, из-за ограничений в скриптах, я не могу их поместить в PowerShell, спасибо за вашу помощь. – user1928098

ответ

0

Хорошо, ваш оригинальный сценарий был ужасно неэффективным и плохо спроектированным. Вот PowerShell, чтобы делать то, что вы хотите, никакие файлы temp не нужны. Обычно у меня бы не было таких комментариев, но я хочу убедиться, что все понимают, что я сделал. Выходные файлы будут находиться в рабочем каталоге, откуда вы выполняете этот метод.

Использование (в CMD/партии): -command PowerShell "& {\ FileContainsThisFunction.ps1; экстракт Хосты original.csv.}"

Использование (в) PowerShell:. \ FileContainsThisFunction.ps1; Extract-хосты original.csv

function Extract-Hosts { 
    param(
     [Parameter(Mandatory=$true)] 
      [String]$InputFile 
    ) 

    if(-not (Test-Path $InputFile)) { throw ("Input file doesn't exist: {0}" -f $InputFile) } 

    # Extract filename without path or extension 
    $BaseName = Get-Item $InputFile | Select -ExpandProperty Basename 

    # Create a custom object that conains the outfilename and the content for lwks and wks 
    $OutLwks = @{ File = ('{0}-lwks.csv' -f $Basename); Content = @() } 
    $OutWks = @{ File = ('{0}-wks.csv' -f $Basename); Content = @() } 

    # First, delete the output files if they exist 
    $OutLwks, $OutWks | ForEach { if (Test-Path -Path:($_.File)) { Remove-Item $_.File } } 

    # Import the original csv into the pipeline 
    Import-Csv $InputFile | 
     # We only care about the IP and Hostname columns 
     Select -Property IP, Hostname | 
     # Where the hostname is not empty, nor contains n/a or n/s 
     Where { $_.Hostname -iNotMatch '(^$|n/a|n/s)' } | 
     ForEach-Object { 
      # If it contains lwks, add it to that list 
      if ($_ -imatch 'lwks') { 
       ($OutLwks.Content += $_) 
      } 
      # if it contains wks but NOT lwks, add to the other list 
      elseif ($_ -imatch 'wks') { 
       ($OutWks.Content += $_) 
      } 
     } | Out-Null # Sends objects to null after pipeline processing. 

    # Splat each one into the appropriate CSV file 
    $OutLwks, $OutWks | ForEach-Object { 
     $_.Content | Export-Csv -Path $_.File -NoTypeInformation } 
    } 

Edit: Исправлена ​​опечатка во втором контентной Кроме того, он должен был прочитать OutWks.Content + = $ _ Edit +: Заменено Где магия с Foreach, чтобы сделать его проще для понимания; Добавлен Out-Null для подавления вывода после конвейера.

Надеюсь, этот сценарий поможет вам на шаг приблизиться к написанию богатых конвейерных процессоров в powershell.

+0

Привет, Eris, ваш скрипт работал отлично, но просто сделан в половина. После этого было создано 2 файла: original-lwks.csv (спасибо, 100% сделано) + original-wks.csv (null content = 0%). Пожалуйста, помогите мне в этом деле, спасибо! – user1928098

+0

ничего не меняется, не могли бы вы попытаться запустить свой скрипт, у original-dad.csv все еще есть нулевой контент. Благодаря! – user1928098

+0

Удивительный, он отлично работал, благодаря миллиарду Эрис. Честно говоря, не могли бы вы дать мне свою руку еще раз, для этих двух файлов original-lwks.csv и original-wks.csv, любезно помогите мне извлечь столбец IP-адреса без заголовка в txt-файл, например: original -lwks.txt и original-wks.txt – user1928098

Смежные вопросы