2014-04-16 118 views
5

第一篇文章,所以請不要傷害我。我四處搜尋,但似乎無法找到一種方法來做我想做的事。我已經制作了一個腳本,可以將文件夾複製到\ $ computer \ c $的許多計算機上。在這些文件夾中是運行.exe的批處理文件。我想要做的是從我用來複制該文件夾的相同computers.txt獲取Powershell,然後使用psexec運行該批處理文件。我可以手動完成這一切,但腳本似乎是一個問題,這是我認爲會工作,但顯然不是。使用Powershell運行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

這是實際的腳本複製和粘貼?或者只是重新鍵入,可能有一些錯別字? – TheMadTechnician

+0

我複製/粘貼它。我在Powershell中使用腳本非常新手,如果語法太糟糕,我很抱歉。 – noz3r0

+0

儘量不要使用PowerShell psexec,我得到很多問題在這... –

回答

8

好吧,讓我們從最高層開始。

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

將「computers.txt」文件的內容加載到變量$computers中。很簡單,沒有問題。

接下來我們有一個ForEach循環。它分割$computers的內容,並將每行(可能是計算機的名稱)作爲$computer針對花括號內的所有代碼進行處理。

foreach ($computer in $computers) { 

該循環以標準的If-Then語句啓動。如果(condition)那麼{do stuff}。在這種情況下,它正在測試以確定網絡上是否有可用的$computer。如果是,那麼它會嘗試在其上運行PSExec。如果它不在線,它會運行Else條款,我們將在一秒鐘內完成。

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

然後它改變目錄。有點毫無意義,但好吧,無論如何。你可以明確地調用它,如C:\PSTools\PSExec.exe <arguments>並保存了一行,但確實沒有造成任何傷害。

cd C:\pstools 

然後你打電話給PSExec,雖然這裏有一點語法錯誤。它應該是$computer而不是%computer。此外,它應該只有你想要執行的命令,而不是第二行的命令cmd。如果您使用Call運算符(&)讓PowerShell意識到它正在嘗試執行某些操作並且不運行cmdlet或函數,或者沒有運行,您可能會得到更好的結果。

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

經過是這樣說,如果電腦是不能上網寫字符串「$電腦不上網」後閉括號爲else子句和foreach循環else子句。

} else { 
    "$computer is not online" 
} 


} 

編輯:好了,你完成的腳本應該是這個樣子(封閉的目標在引號的情況下有路徑中的空格):

$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

好吧,我看到我可以縮小一點。感謝您的全面細分。我現在的問題是,我無法使Psexec函數正常工作,我不確定我做錯了什麼。如果我這樣做手動,我會打開一個命令提示符並鍵入 'psexec \\ hostname cmd'然後我將在該機器命令提示符,從中我可以導航到我想要的文件夾並運行批處理文件。 – noz3r0

+0

你確定它失敗了嗎?如果您在PowerShell ISE中運行它,PSExec將會拋出一個錯誤,並且仍然有效。這是有原因的,它與PSExec如何輸出數據有關,其中一些輸出到標準輸出流,其中一些輸出到錯誤流。無論如何,你確定它不工作? – TheMadTechnician

+0

我看到你在那裏扔了一個編輯,我的最後腳本不像你有什麼,我會在早上給你一個去,讓你知道。它似乎應該工作。感謝您的勤奮。 – noz3r0

1

試試這個。你有一個%你想要$。此外cmd.exe調用是不必要的。

$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

虛假警報。它不會像這樣運行psexec,並稱它不是一個有效的cmdlet。有沒有一個命令來運行可執行文件? – noz3r0

0

使用&(電話)運營商, & psexec \ $計算機「C:\ Folder \ install。蝙蝠「

4

我意識到這個問題是從2014年開始的,這個答案不會直接解決用戶提出的問題,但對於現在遇到這個問題的人來說,我想扔掉那個你沒有需要*如果你正在使用PowerShell的使用PSEXEC。既然你在PowerShell中是已經,只是用Invoke-Command

語法將

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

它就是這麼簡單。

*需要在目標服務器上啓用PowerShell遠程處理。

+1

這是一個粗略的過度簡化。如果install.bat需要雙跳,這將不起作用。 –