Hãy nhớ rằng PowerShell xử lý các đối tượng chứ không phải chỉ văn bản. Trong khi trong các tập tin batch bình thường bạn có thể thiết lập một biến thành một chuỗi và sau đó chỉ cần sử dụng nó như một lệnh:
set Foo=dir /b
%Foo%
... điều này không làm việc trong PowerShell.Do đó, nhiệm vụ của bạn là $Start
đã tạo quy trình mới kể từ khi lệnh sau khi =
được chạy và kết quả của nó được gán cho $Start
.
Hơn nữa, bạn đang làm phức tạp những thứ không cần thiết. Tôi muốn đề nghị sau đây thay vì:
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
Kể từ Get-Process
lợi nhuận một đối tượng (trong đó đánh giá để $true
) hoặc $null
(mà đánh giá để $false
), bạn có thể đơn giản hóa việc kiểm tra như trình bày ở trên. Điều này được gọi là loại cưỡng chế, vì tuyên bố if
dự kiến giá trị boolean và các quy tắc về những gì sẽ được coi là $true
và $false
rất nhất quán trong các trường hợp như trên. Và nó đẹp hơn.
Tôi cũng đã sử dụng lệnh ghép ngắn Start-Process
thay vì WMI để tạo quy trình mới. Bạn thậm chí có thể sử dụng như sau:
if (!$Running) { C:\utilities\prog.exe }
nếu ứng dụng không phải là một ứng dụng giao diện điều khiển (và do đó sẽ ngăn chặn kịch bản PowerShell cho đến khi nó thoát). PowerShell vẫn là một trình bao, vì vậy các chương trình bắt đầu là một cái gì đó hoạt động rất tốt :-)
Bạn thậm chí có thể thay đổi biến số $running
, nhưng tôi đoán là một nhận xét sẽ làm rõ những gì bạn làm.
OK cảm ơn bạn đã giải thích rõ ràng. – Charlotte
Tôi không hiểu giải pháp của bạn sẽ giải quyết vấn đề như thế nào. Dòng '$ Start = ...' sẽ vẫn bắt đầu quá trình này mỗi lần. Tôi kiểm tra chạy mã và bội số của quá trình tương tự đã được bắt đầu. (hãy chắc chắn để kiểm tra với một chương trình cho phép một số instanses của chính nó) – LosManos
Hi @LosManos, là nó có thể bạn quên {} (scriptblock)? –