2016-03-09 85 views
11

我有6個以上的腳本並正在不斷增長以運行在一個文件夾上,讓它們一個接一個運行的最佳方法是什麼。按順序運行多個Powershell腳本 - 在一個文件夾上 - 將腳本合併到主腳本中

我已經看到並嘗試過這個線程 - 它不工作不幸。

How to run multiple Scripts one by one in a powershell script

在主.ps文件 - 我已經把鏈接到了需要爲了爲了

'C:\Users\WP\Desktop\Scripts\1.ps1' 
'C:\Users\WP\Desktop\Scripts\2.ps1' 
'C:\Users\WP\Desktop\Scripts\3.ps1' 

等運行

運行腳本電源外殼腳本

這也沒有工作。你的幫助表示讚賞 - 我已經搜遍了,似乎無法解決這個問題。

修訂:我相信我將不得不等待每個電源外殼腳本來運行在下單前完成 - 因爲我有錯誤,當我試圖運行3個腳本一前一後 - 什麼都沒有發生,當腳本被運行

最終 -

我感謝大家的幫助 - 讓事情變得簡單,這是我做了什麼

我的文件夾中有下面的腳本 - 我有那麼創建的主控。 ps1與代碼b elow裏面:

&"$PSScriptroot\1.ps1" 
&"$PSScriptroot\2.ps1" 
&"$PSScriptroot\3.ps1" 
&"$PSScriptroot\4.ps1" 
&"$PSScriptroot\5.ps1" 
&"$PSScriptroot\6.ps1" 

我已經然後在文件夾上的所有文件運行Master.ps1 - 和它的工作至今。

+0

當你一個接一個地說'你想等待每個腳本完成後再運行下一個腳本,還是同時運行它們? – Bluecakes

+0

嗨,我應該等待每一個完成 - 這是有道理的。運行腳本1 - 然後2然後3,順序:) – wp44

回答

9

如果你不想硬編碼路徑,你可以做主。ps1是這樣的:

&"$PSScriptroot\1.ps1" 
&"$PSScriptroot\2.ps1" 
&"$PSScriptroot\3.ps1" 

它會在同一個目錄下尋找那些腳本。

+0

'$ PSScriptroot'總是在那裏?我一直在用'Split-Path $ MyInvocation.MyCommand.Definition'解析腳本根目錄,看起來像是永遠。 – TheMadTechnician

+0

嗨Mj - 我做了這個&「C:\ Users \ WP \ Desktop \ Mjolinor \ 1.ps1」 &「C:\ Users \ WP \ Desktop \ Mjolinor \ 2.ps1」 - 它工作:) - 是在下一個腳本運行之前,有任何機會 - 它可以等待完成 - 以防將來 - 我可能有一個長腳本,以防止在文本文件中出現意大利麪條結果 - 謝謝 – wp44

+1

它們將按默認順序運行。您必須使用作業或運行空間才能將其轉換爲多線程。 – mjolinor

0

您是否硬編碼主文件中文件的路徑?

在這種情況下,這樣的事情應該工作

Invoke-Expression "C:\Users\WP\Desktop\Scripts\1.ps1" 
Invoke-Expression "C:\Users\WP\Desktop\Scripts\2.ps1" 
Invoke-Expression "C:\Users\WP\Desktop\Scripts\3.ps1" 
+0

我寧願不要硬編碼 - 但作爲powershell noob - 我不知道。如果我將master.ps放在文件夾中,並且所有其他腳本 - 我如何從主站調用它們?謝謝隊長 – wp44

1

爲了讓你的腳本是可以做到這一點的路徑:

$MyInvocation.MyCommand.Definition 

這將顯示類似「C:\用戶\ WP \桌面\腳本\ Master.ps1' 。我們可以通過Split-Path來獲取文件夾,然後在文件夾上運行Get-ChildItem以獲取文件列表。我們可能會想排除主腳本,這樣我們就不會在遞歸循環結束了,這樣看起來是這樣的:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition 
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition} 

然後我們只需運行那些通過ForEach-Object循環,並調用與呼叫運營商&腳本這樣:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition 
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition} | ForEach-Object { & $_.FullName } 

編輯:嗯,這是不正確的過濾。這是一個重寫,可以正確過濾主腳本。

$Master = Split-Path $MyInvocation.MyCommand.Definition -Leaf 
$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition 
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.Name -ne $Master} | ForEach-Object { & $_.FullName } 
+0

TMD,謝謝 - 在文件夾裏我放了2個腳本和主腳本,這些腳本調用了這些......發生了什麼......但是之後它進入了一個循環。在主人我把這個:$ MyInvocation.MyCommand.Definition $ ScriptPath =拆分路徑$ MyInvocation.MyCommand.Definition Get-ChildItem「$ ScriptPath \ *。ps1」|其中{$ _。FullName -ne $ MyInvocation.MyCommand.Definition} | ForEach-Object {&$ _。FullName} - 我不知道我做得對不對? – wp44

+0

對不起,我的第一個版本沒有過濾出主腳本,所以它作爲腳本的一部分運行,並且創建了一個無限循環。我更新了我的答案。 – TheMadTechnician

+0

謝謝我會將此添加到我的電源外殼工具 - 框 - :) – wp44

0

按順序運行多個腳本可以使用-Wait參數上Start-Process像這樣:

$scriptsList = 
@(
    'C:\Users\WP\Desktop\Scripts\1.ps1' 
    'C:\Users\WP\Desktop\Scripts\2.ps1' 
    'C:\Users\WP\Desktop\Scripts\3.ps1' 
) 

foreach($script in $scriptsList) 
{ 
    Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-command '& $script'" -Wait 
} 

的PowerShell將等待當前腳本運行下一個腳本

+0

嗨公元前 - 我跑了這個權力殼屏幕出現了 - 但文本文件沒有發生變化 - 我不知道爲什麼:( – wp44

1

之所以PowerShell的前完成屏幕彈出是因爲你沒有參數-NoExit設置。請使用以下作爲一個例子,看看你的代碼運行正常:

Start-Process "$pshome\powershell.exe" -ArgumentList "-NoExit", "-Command '& script'" -wait 

對不起,響應遲,但我也遇到了這個問題,這就是我如何能夠解決這個問題,以確保它是工作。

我也改變了文件名稱如下:

$Scripts = 
@(
".\C:\Scripts\First.ps1" 
".\C:\Scripts\Second.ps1" 
".\C:\Scripts\Third.ps1" 
); 
2

只需創建一個文本文件,使用任何代碼編輯器或文本編輯器,並使用以下示例批處理腳本:

start /min powershell.exe C:\your folder\script1.ps1 
start /min powershell.exe C:\your folder\script2.ps1 

保存它作爲script.bat並打開它。這將使兩個PowerShell腳本同時運行。

相關問題