2012-02-09 28 views
6

Tôi mới dùng powershell, nhưng tôi đang cố gắng để đăng xuất một số đăng nhập đơn giản trong một ps tôi đang viết để tạo các tác vụ theo lịch. Mã của tôi là dưới đây. Dường như nó không ném một ngoại lệ khi bạn gặp lỗi với lược đồ. Một câu hỏi SO đã đề cập đến điều này với các hành động của fileIO và đề xuất thực hiện "-ea stop" nhưng điều đó không làm việc với các lược đồ.try-catch-fail với powershell và schtasks

#create log file 
$log = "\\servername\!incoming\Deploy\log.txt" 
Clear-Content $log 

#get input file list 
$txtServerList = Gc "\\servername\!incoming\Deploy\serverlist.txt" 
#loop through each server 
ForEach($strServername In $txtServerList) 
{ 
    try 
    { 
     #install task from XML template 
     schtasks /create /s $strServername /tn InventoryServer /XML "\\servername\!incoming\Deploy\TaskTemplate.xml" 
     #run the task immediately 
     schtasks /run /s $strServername /tn InventoryServer 
    } 
    catch [exception] 
    { 
     Add-Content -path $log -value $strServername 
     #Add-Content -path $log -value $_.Exception 
     #Add-Content -path $log -value $_.Exception.Message 
     #Add-Content -path $log -value "" 
    } 
} 

Tôi xác nhận rằng 'Add-Content -path '\ servername! Đến \ Deploy \ log.txt' -giá trị 'test'' công trình, do đó, như tôi đã nói tôi khá chắc chắn nó chỉ là không ném một ngoại lệ.

+0

Xin lỗi, đây là một thời gian dài trước đây. Công việc của tôi đã thay đổi đáng kể vào tháng 3 nên tôi thậm chí không chắc tôi đã hoàn thành việc này. Tôi sẽ dành một chút thời gian để tìm nó cho bạn. –

+0

Cảm ơn, nó sẽ là tuyệt vời có được mã nguồn mẫu đầy đủ làm việc. – Kiquenet

Trả lời

9

Để Try/Catch hoạt động, PowerShell cần ngoại lệ chấm dứt. Khi chạy một lệnh ghép ngắn trong khối Thử, bạn có thể thực hiện điều đó bằng cách sử dụng -erroraction Stop (hoặc sử dụng bí danh -ea). Như bạn đã nhận ra SCHTASKS.EXE không thể làm điều này. Nếu không có một ngoại lệ chấm dứt, mã trong khối Catch sẽ không bao giờ chạy.

Những gì bạn phải làm là bước ra ngoài hộp, vì vậy để nói chuyện và kiểm tra độc lập nếu Schtasks không thành công. Nếu có, họ có thể sử dụng Write-Error trong khối Try của bạn.

Một điều bạn có thể thử là sử dụng Bắt đầu quá trình và xem mã thoát. Bất cứ điều gì khác hơn 0 phải là một lỗi.

Try { 
get-date 
$p=Start-Process schtasks.exe -ArgumentList "/Create foo" -wait -passthru 
if ($p.exitcode -ne 0) { 
    write-error "I failed with error $($p.exitcode)" 
} 
} 

Catch { 
"oops" 
$_.Exception 
}