2016-03-09 17 views
11

Tôi có hơn 6 tập lệnh và phát triển để chạy trên một thư mục, cách tốt nhất để chạy chúng sau cái kia là gì.Chạy nhiều kịch bản Powershell theo tuần tự - trên một thư mục - kết hợp các tập lệnh thành tập lệnh chính

Tôi đã xem và thử chủ đề này - nó không hoạt động không may.

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

Trong tập tin một bậc thầy .ps - Tôi đã đặt liên kết đến các kịch bản shell điện mà cần phải được chạy theo thứ tự

Run Scripts nhằm

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

vv

Điều này không hoạt động. Trợ giúp của bạn được đánh giá cao - Tôi đã tìm kiếm tất cả và dường như không thể khắc phục vấn đề này.

Đã sửa đổi: Tôi tin rằng tôi sẽ phải đợi từng kịch bản lệnh để kết thúc trước khi chạy kịch bản tiếp theo - vì tôi đã gặp lỗi khi cố gắng chạy 3 tập lệnh sau tập lệnh kia - không có gì xảy ra khi tập lệnh được chạy

cuối cùng -

tôi cảm ơn tất cả các bạn đã giúp đỡ của bạn - để giữ cho mọi thứ đơn giản đây là những gì tôi đã làm

thư mục My có kịch bản dưới đây - sau đó tôi đã tạo ra một tổng thể. ps1 với mã b elow bên trong nó:

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

Sau đó tôi chạy Master.ps1 trên thư mục với tất cả các tệp - và nó thực hiện công việc cho đến nay.

+0

Khi bạn nói 'một sau cái kia', bạn có muốn đợi cho mỗi tập lệnh hoàn thành trước khi chạy tập lệnh tiếp theo hay chạy tất cả cùng một lúc không? – Bluecakes

+0

Xin chào, tôi nên chờ cho mỗi người kết thúc - điều đó có ý nghĩa. Chạy kịch bản 1 - sau đó 2 rồi 3, tuần tự :) – wp44

Trả lời

9

Nếu bạn không muốn mã hóa đường dẫn, bạn có thể tạo Master.ps1 như thế này:

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

Và nó sẽ tìm kiếm những tập lệnh đó trong cùng một thư mục.

+0

Có '$ PSScriptroot' luôn ở đó không? Tôi đã phân tích cú pháp của tập lệnh gốc bằng 'Split-Path $ MyInvocation.MyCommand.Definition' cho những gì có vẻ như mãi mãi. – TheMadTechnician

+0

Xin chào Mj - Tôi đã làm điều này & "C: \ Users \ WP \ Desktop \ Mjolinor \ 1.ps1" & "C: \ Users \ WP \ Desktop \ Mjolinor \ 2.ps1" - nó hoạt động :) - là có bất kỳ cơ hội nào - nó có thể đợi để hoàn thành - trước khi tập lệnh tiếp theo chạy - chỉ trong trường hợp trong tương lai - tôi có thể có một tập lệnh dài, để ngăn chặn kết quả spaghetti trong các tệp văn bản - cảm ơn bạn – wp44

+1

Chúng sẽ chạy tuần tự theo mặc định. Bạn phải sử dụng các công việc hoặc các không gian chạy để đưa nó vào đa luồng. – mjolinor

0

Bạn có khó mã hóa đường dẫn đến tệp trong tệp chính không?

Trong trường hợp này một cái gì đó như thế này nên làm việc

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

Tôi không muốn mã cứng - nhưng như là một noob powershell - Tôi không có đầu mối. Nếu tôi đặt một master.ps trong thư mục với tất cả các kịch bản khác - làm thế nào tôi sẽ gọi chúng từ chủ? Cảm ơn bạn Thuyền trưởng – wp44

1

Để có được con đường mà kịch bản của bạn là ở bạn có thể làm điều này:

$MyInvocation.MyCommand.Definition 

Điều đó sẽ hiển thị một cái gì đó như 'C: \ Users \ WP \ Desktop \ Scripts \ Master.ps1 '. Từ đó chúng ta có thể thực hiện Split-Path để chỉ nhận thư mục và chạy Get-ChildItem trên thư mục để nhận danh sách tệp. Có lẽ chúng ta sẽ muốn loại trừ kịch bản tổng thể, vì vậy mà chúng ta không kết thúc trong một vòng lặp đệ quy, do đó sẽ giống như thế:

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

Sau đó, chúng tôi chỉ cần chạy những qua một vòng lặp ForEach-Object, và gọi kịch bản với các nhà điều hành cuộc gọi & như vậy:

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

Edit: Hm, mà không được lọc đúng. Đây là viết lại để lọc ra tập lệnh chính một cách chính xác.

$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, cảm ơn bạn - Trong thư mục tôi đặt 2 tập lệnh và tập lệnh chính gọi những tập lệnh đó ... đã xảy ra sự cố .. nhưng nó đã đi vào vòng lặp sau. Trong tổng thể tôi đặt giá trị này: $ MyInvocation.MyCommand.Definition $ ScriptPath = Split-Path $ MyInvocation.MyCommand.Definition Get-ChildItem "$ ScriptPath \ *. Ps1" | Trong đó {$ _. FullName -ne $ MyInvocation.MyCommand.Definition} | ForEach-Object {& $ _. FullName} - Tôi không chắc mình đã làm đúng chưa? – wp44

+0

Xin lỗi, phiên bản đầu tiên của tôi không lọc ra tập lệnh chính, vì vậy nó đã tự chạy như một phần của tập lệnh và chỉ tạo ra một vòng lặp vô tận. Tôi đã cập nhật câu trả lời của mình. – TheMadTechnician

+0

Cảm ơn bạn tôi sẽ thêm điều này vào các công cụ vỏ nguồn của tôi - hộp - :) – wp44

0

Để chạy nhiều kịch bản liên tục, bạn có thể sử dụng tham số -Wait trên Start-Process như vậy:

$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 sẽ chờ đợi kịch bản hiện nay để kết thúc trước khi chạy kịch bản tiếp theo

+0

Xin chào BC - Tôi đã chạy màn hình vỏ nguồn này đã xuất hiện - nhưng không có thay đổi nào xảy ra trong tệp văn bản - Tôi không biết tại sao :( – wp44

1

Lý do tại sao các powershell màn hình bật lên là cuz bạn không có đối số -NoExit thiết lập. Vui lòng sử dụng sau đây là một ví dụ để xem nếu mã của bạn đang chạy đúng cách:

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

Xin lỗi vì sự chậm phản ứng nhưng tôi cũng chạy vào vấn đề này và thats làm thế nào tôi đã có thể giải quyết nó để chắc chắn rằng nó là công việc .

Ngoài ra tôi thay đổi tên tập tin như sau:

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

Đơn giản chỉ cần tạo ra một tập tin văn bản, sử dụng bất kỳ trình soạn mã hoặc soạn thảo văn bản, và sử dụng kịch bản ví dụ hàng loạt sau:

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

Lưu nó như là một script.bat và mở nó. Điều này sẽ làm cho hai script PowerShell chạy cùng một lúc.

Các vấn đề liên quan