2011-08-08 59 views
6

Bối cảnh: Tôi có một kịch bản PowerShell: script1 mà mất trong một sourceDirectory và hai điểm đến (gọi cho họ dest1Directorydest2Directory).Powershell: Nhận kết quả trả về từ Powershell Script gọi từ bên trong PS Script khác

Các sourceDirectory được cấu trúc như thế này:

\ Source \ dest1 \ STUFF1

\ Source \ dest2 \ STUFF2

script1 cuộc gọi tập lệnh khác: script2, foreach STUFF (vì vậy script2 có thể chạy 10 lần chẳng hạn), cung cấp script2 với thông số đích cần thiết, tạo bản sao lưu tất cả nội dung "STUFF" được thay thế trên dest1Directorydest2Directory rồi sao chép tất cả STUFF đích tương ứng.

Script1:

foreach ($folder in $STUFF1) 
{   
& $script2 -stuffParameter $folder -destDrive $dest1Directory -backUpDrive $BackUpDirectory 
} 

Vấn đề tôi đang gặp là:

Tôi gọi script1 từ một trang web visual studio và muốn script2 để đầu ra tất cả các đường dẫn thư mục sao lưu nó tạo ra vì vậy tôi có tài liệu tham khảo cho họ sau này. Tôi đã cố gắng bên này script2:

$returnRollBackObj = New-Object Object 
Add-Member -memberType NoteProperty -name "RollBackLocation" -value $folderobj -inputObject $returnRollBackObj 
return $returnRollBackObj 

Nhưng nó dường như không trả lại đối tượng vì chúng là các cuộc gọi subscript. Tôi không biết làm thế nào để trả lại một số không xác định của các đối tượng này từ script1 vì vậy tôi đang thua lỗ. Ai đó có thể giúp tôi không?

Trả lời

11

Bất kỳ đầu ra không được đảm bảo nào được trả về trong Powershell.

Vì vậy, một cái gì đó giống như

return $returnRollBackObj 

tương đương với

$returnRollBackObj 
return 

Vì vậy, kể từ script2 đang trở lại các đối tượng này, miễn là các đối tượng này không bị bắt trong script1, họ sẽ được trả lại bởi script1 cũng. Vì vậy, bạn không phải làm bất cứ điều gì về việc "trả lại số lượng đối tượng không xác định"

Thử chạy các tập lệnh từ bảng điều khiển trước để xem bạn có đang thực hiện hành vi dự định hay không.

+0

Tôi đã tìm được nhiều nhưng khi tôi thử nó không hoạt động như mong đợi. Tôi có 'script1' gọi' script2' với trả về không được trả về, tuy nhiên chỉ có một câu lệnh return từ đầu ra 'script1' đến bàn điều khiển của tôi. Có một loạt đầu ra 'Write-Host/Write-Warning' hoạt động tốt từ' script2'. –

+0

@Evan Layman - bạn muốn trả lại gì từ tập lệnh 1? – manojlds

+0

Xin lỗi tôi không nghĩ rằng cần thiết phải bao gồm điều này: Tôi có một đối tượng khác chứa vị trí nhật ký được trả lại từ 'script1' (và điều này hoạt động chính xác) –

2

Cài đặt IIS của bạn như thế nào?

Chỉ cần suy nghĩ, nếu bạn có tính năng eimpersonation, nó có thể không có quyền truy cập vào vị trí của tập lệnh thứ hai do vấn đề nhảy kép.

Điều gì đó khác có thể hữu ích là chức năng chuyển biên.Thêm một bản ghi bắt đầu ở đầu tập lệnh/mã yu và bạn sẽ nhận được kết xuất tất cả mọi thứ, comands và đầu ra (inc. Lỗi và cảnh báo).

Edit:

Chỉ cần nhận ra bạn không gán các giá trị trở về từ script2 để aaything trong script1.

Bạn có thể cần một cái gì đó như thế này:

$ ret = & $ script2 ...

Do something với $ ret ...

HOẶC đặt nó trong một mảng $ ret = @()

Đối với loop ...

$ temp = & $ script2 ... $ ret = $ ret + $ temp

Sau đó trả lại $ ret sau vòng for.

Matt

+0

Cả hai ý tưởng hay, tuy nhiên điều này xảy ra khi tôi kiểm tra nó thông qua lệnh powershell prompt (và kịch bản thứ hai chắc chắn đang chạy chính xác, bên cạnh đầu ra), và tôi thực sự có một bảng điểm đang chạy, tuy nhiên nó không giúp tôi với vấn đề này. –

+0

Tôi không nghĩ rằng chạy từ dấu nhắc lệnh phủ nhận một vấn đề tăng gấp đôi hop, tôi hy vọng nó sẽ hoạt động. Điều đó nói rằng tôi nhận thấy bạn không làm bất cứ điều gì với biến trả về. Tôi đã chỉnh sửa câu trả lời của mình để chỉ ra điều đó. – Matt

+0

Tôi sẽ thử điều đó, nhưng tôi đã tìm thấy lợi nhuận từ tập lệnh 2 sẽ truyền lên. Có thể không :). Cảm ơn bạn đã lấy mẫu –

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