2014-06-05 58 views
0

我想在多臺服務器(近40-50服務器)平行

$用戶名=「用戶」運行這個我試圖在遠程服務器上執行現有的腳本,並捕獲在本地文件輸出

$Password = "Password" 

$servers = get-content "c:\temp\servers.txt" 

$sb = {c:\temp\PsExec.exe -h \\$server -u $Username -p $password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$env:userprofile\Desktop\output.txt"} 

foreach($server in $servers) 
{ 
    start-job -ScriptBlock $sb 
} 

此代碼工作正常,如果我刪除啓動作業,但執行一個接一個,這需要很多時間。

我無法使用PSsession或invoke-command,因爲它在我們的環境中受到限制。

此代碼從不退出。它停在這個位置:

+ CategoryInfo   : NotSpecified: (:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

PsExec v1.98 - Execute processes remotely 
Copyright (C) 2001-2010 Mark Russinovich 
Sysinternals - www.sysinternals.com 
+2

爲什麼使用powershell運行psexec來運行powershell?你喜歡複雜嗎?你可以做一些像'icm -ComputerName servername -scriptblock {invoke-expression c:\ script.ps1} -asjob' –

+0

@Kayasax ##如果我使用上述表達式,我得到以下錯誤## 連接到遠程服務器失敗並顯示以下錯誤消息:WinRM客戶端無法處理該請求。如果身份驗證方案爲不適用於Kerberos的d ,或者客戶端計算機未加入域,則必須使用HTTPS傳輸,或者必須將目標計算機添加到 TrustedHosts配置設置。使用winrm.cmd配置TrustedHosts。請注意,TrustedHosts列表中的計算機可能未經過身份驗證。 – Chand

+0

我忘了提及...我正在使用powershell 2.0 – Chand

回答

0

開始時你沒有將任何變量傳遞給作業。你需要的是在ScriptBlock中使用$ args變量,然後用-ArgumentList傳遞你想要的變量。

$Password = "Password" 

$servers = get-content "c:\temp\servers.txt" 

$sb = { 
    c:\temp\PsExec.exe -h \\$args[0] -u $args[1] -p $args[2] cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$args[3]\Desktop\output.txt" 
} 

foreach($server in $servers) 
{ 
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile 
} 

我可能不需要傳遞環境變量,但它似乎像你有變量的範圍界定問題。

或者,您可以在ScriptBlock中使用一個Param塊來命名您的變量,它實際上將位置上的參數傳遞到指定的變量中。

$Password = "Password" 

$servers = get-content "c:\temp\servers.txt" 

$sb = { 
    Param ($Server,$UserName,$Password,$UserProfile) 

    c:\temp\PsExec.exe -h \\$Server -u $UserName -p $Password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$UserProfile\Desktop\output.txt" 
} 

foreach($server in $servers) 
{ 
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile 
} 

我希望這有助於。乾杯,克里斯。

相關問題