2014-04-16 18 views
5

Pierwszy wpis, więc nie rób mi krzywdy. Szukałem, ale nie mogę znaleźć sposobu, aby zrobić to, co chcę. Zrobiłem skrypt, który kopiuje folder, który mam do wielu komputerów na \ $ komputer \ c $. W tych folderach znajduje się plik wsadowy z uruchomionym plikiem .exe. Chciałbym, aby Powershell pobierał dane z tego samego pliku computers.txt, którego użyłem do skopiowania folderu, a następnie użył psexec do uruchomienia pliku wsadowego. Mógłbym zrobić to wszystko ręcznie, ale pisanie skryptów wydaje się być problemem, oto co myślałem, że zadziała, ale najwyraźniej nie.Użyj Powershell, aby uruchomić komendę Psexec

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\%computer cmd 
    C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

}

+0

Czy to właściwy skrypt został skopiowany i wklejony? Lub po prostu ponownie napisany, być może z kilkoma literami? – TheMadTechnician

+0

Kopiuję/wklejam. Jestem bardzo początkującym ze skryptów w Powershell, przepraszam, jeśli składnia jest nędzna. – noz3r0

+0

staram się nie używać psexec z powershell, mam wiele problemów na ten temat ... –

Odpowiedz

8

OK, weźmy to od góry.

$computers = gc "C:\scripts\computers.txt" 

To ładuje zawartość pliku "computers.txt" do zmiennej $computers. Wystarczająco proste, bez problemów.

Następnie mamy pętlę ForEach. Dzieli zawartość $computers i przetwarza każdą linię (prawdopodobnie nazwę komputera) pod kątem całego kodu w nawiasach klamrowych.

foreach ($computer in $computers) { 

Pętla ta rozpoczyna się standardową instrukcją If-Then. Jeśli (condition) to {do stuff}. W takim przypadku sprawdza się, czy $computer jest dostępny w sieci. Jeśli tak, to próbuje uruchomić na nim PSExec. Jeśli nie jest online, uruchamia klauzulę Else, do tego dojdziemy za chwilę.

if (test-Connection -Cn $computer -quiet) { 

Następnie zmienia katalog. Coś bezcelowego, ale dobrze, cokolwiek. Mogłeś nazwać go jawnie, na przykład C:\PSTools\PSExec.exe <arguments> i zapisać linię, ale naprawdę nie zaszkodzi.

cd C:\pstools 

Następnie dzwonisz do PSExec, ale tutaj jest mały błąd składniowy. Powinien to być $computer, a nie %computer. Powinien też mieć polecenie, które chcesz wykonać, a nie cmd i polecenie w drugim wierszu. Możesz mieć lepsze wyniki, jeśli użyjesz operatora połączenia (&), aby powershell zdał sobie sprawę, że próbuje wykonać coś, a nie uruchamia cmdlet lub funkcję, a co nie.

& psexec \\$computer C:\Folder\install.bat 

Po to jest klauzula Else, który mówi, jeśli komputer nie jest zalogowany, aby napisać ciąg „$ komputer nie jest on-line”, a następnie zamknięcie szelki dla klauzuli indziej i pętli foreach.

} else { 
    "$computer is not online" 
} 


} 

Edit: Ok, twój gotowy skrypt powinien wyglądać mniej więcej tak (zamknięty docelowej w cudzysłowach w przypadku istnieją przestrzenie w ścieżce):

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
    if (test-Connection -Cn $computer -quiet) { 
     & C:\pstools\psexec.exe \\$computer "C:\folder\install.bat" 
    } else { 
     "$computer is not online" 
    } 
} 
+0

Ok Widzę, jak mógłbym nieco zmniejszyć to. Dzięki za pełny podział. Mój problem polega na tym, że nie mogę poprawnie uruchomić funkcji Psexec i nie jestem pewien, co robię źle. Gdybym robił to ręcznie, otworzyłbym wiersz poleceń i wpisz "psexec \\ nazwa hosta cmd", a następnie znajdowałbym się w wierszu poleceń komputera, z którego mogłem po prostu przejść do żądanego folderu i uruchomić plik wsadowy . – noz3r0

+0

Czy jesteś pewien, że to się nie udaje? PSExec zgłosi błąd, jeśli uruchomisz go w PowerShell ISE i nadal będzie działał. Jest ku temu powód i ma to związek z tym, jak PSExec generuje dane, a część z nich jest wyprowadzana do standardowego strumienia wyjściowego, a część z nich jest wysyłana do strumienia błędów. Niezależnie, czy jesteś pewien, że to nie działa? – TheMadTechnician

+0

Widzę, że rzuciłeś tam edycję, mój ostatni scenariusz nie był taki, jaki miałeś, rano to dam, i dam ci znać. Wygląda jednak na to, że powinno działać. Dziękuję za twoją staranność. – noz3r0

1

spróbuj tego. Miałeś % gdzie chciałeś $. Również wywołanie cmd.exe jest niepotrzebne.

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\$computer "C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

} 
+0

Fałszywy alarm. To nie będzie działało tak, ale nie jest to poprawne polecenie cmdlet. Czy istnieje polecenie uruchamiania plików wykonywalnych? – noz3r0

0

użycie & (call) operator, & psexec \ $ komputer "C: \ Folder \ install.nietoperz "

4

Zdaję sobie sprawę, że to pytanie pochodzi z 2014 roku, a ta odpowiedź nie będzie bezpośrednio odpowiadać na pytanie zadane przez użytkownika, ale dla osób, które natkną się na to pytanie w dzisiejszych czasach, chcę wyrzucić, że nie musisz tego robić, * trzeba użyć PsExec jeśli używasz PowerShell. Skoro jesteś już w PowerShell, wystarczy użyć Invoke-Command.

Składnia byłoby

Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat } 

To naprawdę takie proste.

* Wymaga włączenia zdalnego zarządzania PowerShell na serwerze docelowym.

+1

Jest to nadmierne uproszczenie. Jeśli install.bat musi podwójnie przeskoczyć, to nie zadziała. –

Powiązane problemy