2015-12-24 21 views
6

Tôi đang cố gắng chuyển các tham số từ một tập tin batch sang tập lệnh PowerShell để kiểm tra xem các dịch vụ Windows có đang chạy hay không.Chuyển tham số tới PowerShell từ tập tin bat

Đây là lệnh hoạt động đầy đủ của tôi:

.\nsrservices.ps1 -cmd running nsrexecd,stisvc 

Nhưng vấn đề là hành vi của lệnh:

  • Trong một cửa sổ PowerShell, tên dịch vụ được xem là hai (hoặc nhiều hơn) , do đó kiểm tra 'nsrexecd' sau đó kiểm tra 'stisvc'
  • Trong tệp lô, tên dịch vụ được chuyển đến PowerShell dưới dạng giá trị duy nhất, do đó kiểm tra 'nsrexecd, stisvc'

Dưới đây là file bat của tôi:

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd,stisvc 
ECHO.%ERRORLEVEL% 
exit /B %ERRORLEVEL% 

Trong file PS của tôi, các thông số được định nghĩa như thế:

param([string]$cmd=$(throw "Type d'action manquante !"),[string[]]$srv) 

Trong một tập tin nhật ký, tôi đã có hai kết quả này (xin lỗi vì sản lượng của Pháp).

Từ cửa sổ PowerShell:

24/12/2015 09:02:50-Paramètres appelés : cmd=running srv=stisvc nsrexecd 
24/12/2015 09:02:50-Début test de l'état running du service : stisvc 
24/12/2015 09:02:50- Début évaluation de l'état du service : stisvc 
24/12/2015 09:02:50- Fin évaluation de l'état du service : stisvc 
24/12/2015 09:02:50-Le service tourne 
24/12/2015 09:02:50-Fin test de l'état running du service : stisvc 
24/12/2015 09:02:50-Début test de l'état running du service : nsrexecd 
24/12/2015 09:02:50- Début évaluation de l'état du service : nsrexecd 
24/12/2015 09:02:50- Fin évaluation de l'état du service : nsrexecd 
24/12/2015 09:02:50-Le service tourne 
24/12/2015 09:02:50-Fin test de l'état running du service : nsrexecd 

Có nghĩa là các dịch vụ được kiểm tra tuần tự

Từ file .bat:

24/12/2015 09:04:24-Paramètres appelés : cmd=running srv=nsrexecd,stisvc 
24/12/2015 09:04:24-Début test de l'état running du service : nsrexecd,stisvc 
24/12/2015 09:04:24- Début évaluation de l'état du service : nsrexecd,stisvc 
24/12/2015 09:04:24-  Le service nsrexecd,stisvc n'existe pas ! 
24/12/2015 09:04:24- Fin évaluation de l'état du service : nsrexecd,stisvc 
24/12/2015 09:04:24-Fin test de l'état running du service : nsrexecd,stisvc 

Có nghĩa là các dịch vụ có tên 'nsrexecd, stisvc ' không tồn tại.

Dấu phẩy giữa hai tên tôi dường như để gây nhầm lẫn khi sử dụng một tập tin .bat

Vì vậy, tôi kéo sợi lông cuối cùng của tôi để tìm một cách giải quyết để giành chiến thắng chống lại tập tin .bat đẫm máu này.

Tôi đã thử trích dẫn, trích dẫn một lần, -File, -Command, nhưng không thành công.

Bất kỳ đầu mối hoặc giải pháp nào sẽ được đánh giá cao vì nghiên cứu của tôi trên diễn đàn này đã không cho tôi điều gì đó có thể sử dụng được.

Và tất nhiên, sau đó tôi muốn gọi tệp .bat với thông số.

+1

Một điều bạn có thể làm là không sử dụng dấu phẩy trong cuộc gọi theo lô và thay đổi thông số của bạn cho $ srv thành 'ValueFromRemainingArguments = $ true'. Bạn có thể xem thêm tại đây https://technet.microsoft.com/en-us/library/hh847743.aspx. Hoặc chỉ cần đưa nó vào như một chuỗi đơn và sử dụng '-split '," ' – Matt

+0

Tại sao gọi một tập lệnh PowerShell từ một tập tin thực thi? Chỉ cần chạy nó trực tiếp từ PowerShell. –

+0

@Bill_Stewart: Câu hỏi của tôi là về việc bao gồm PowerShell trong tệp .bat vì tôi phải làm như vậy. Tập lệnh này được khởi chạy từ một chương trình đang chạy không chấp nhận những thứ khác ngoài các tệp .bat và .cmd ... –

Trả lời

2

Trong trường hợp của bạn tôi sẽ sử dụng:

[parameter(Mandatory=$true, 
      ValueFromRemainingArguments=$true)] 
[String[]] 
$services 

gọi lô của bạn sẽ trông như thế này

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd stisvc 

Để biết thêm chi tiết có một cái nhìn để about_Functions_Advanced_Parameters

+0

Giải pháp tuyệt vời; từ những gì tôi có thể nói, đây là cách duy nhất để truyền trực tiếp một mảng các giá trị từ bên ngoài PowerShell. Một điều đáng chú ý: với phương pháp này bạn thực sự _must not_ sử dụng tham số _name_ trong lời gọi ('-services', ở đây). – mklement0

-1

Cuối cùng, tôi đã thay đổi cách của tôi. Vì tôi đã có tên dịch vụ có dấu cách (và tôi phải bao gồm .ps1 trong a.tập tin bat), tôi đã quyết định đặt điều khiển thông số trong chính và chỉ cần rời khỏi số

param([string]$cmd,[string[]]$srv) 

không có kiểm soát.

Cảm ơn tất cả.

-1

Để kêu gọi một kịch bản PowerShell từ một file BAT Tôi thường làm

PowerShell .\script.ps1 -arg 1234 -arg2 5678 

hoặc

PowerShell C:\path\to\script.ps1 -arg 1234 -arg2 5678 

tập tin kịch bản PowerShell của bạn nên có cái gì đó như

param([string]$arg, [string]$arg2) 

tại rất đầu và bắt đầu của tập lệnh.

Trong tham số của tôi ([chuỗi] $ arg, [chuỗi] $ arg2), tôi đã xác định tên chuyển đổi là arg và arg2 tương ứng. Vì vậy, các tập tin BAT sẽ chỉ định bất cứ điều gì sau -arg để $ arg và bất cứ điều gì sau -arg2 đến $ arg2.

Chúng ta có thể thay đổi điều này để một cái gì đó thuận tiện hơn tùy thuộc vào kịch bản của bạn để ví dụ trong kịch bản PowerShell chúng ta có thể thay đổi nó để

param([string]$computer, [string]$filename) 

và trong file BAT, chúng ta có thể kêu gọi PowerShell tương tự như trên nhưng thay vì -arg và -arg2, chúng ta sẽ sử dụng -computer và -filename.

Hãy ghi nhớ rằng nó là thứ tự cụ thể, vì vậy bạn có thể kêu gọi các kịch bản với các đối số như

PowerShell .\script.ps1 -computer MyComputer -filename MyFileName 

hoặc

PowerShell .\script.ps1 -filename MyFileName -computer MyComputer 

-filename sẽ luôn luôn đi đến $ filename

-máy tính sẽ luôn đi tới $ máy tính.

Tôi hy vọng điều này sẽ hữu ích.

+0

OP đã biết cách gọi tập lệnh PS từ tệp batch _in general_, như được hiển thị trong câu hỏi. Vấn đề của ông là cụ thể với một tham số _array_, mà câu trả lời của bạn không giải quyết. Ngoài ra, tên thông số là _not_ phân biệt chữ hoa chữ thường trong PowerShell. – mklement0

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