2012-03-02 60 views
15

Tôi đã tìm kiếm tất cả và thử các biến thể khác nhau của lệnh, nhưng tôi vẫn chưa có.Powershell Thực thi exe từ xa với các đối số dòng lệnh trên máy tính từ xa

Mục tiêu của tôi là chạy một exe đã nằm trên một máy từ xa và chuyển các đối số dòng lệnh. Tôi đã cố gắng gọi lệnh, nhưng tôi dường như không thể nhận được cú pháp của tôi để nhận ra các đối số.

Phương pháp thử:

  1. Win32_Process.Create()
  2. Invoke-Command
  3. Start-Process
  4. [diagnostics.process] :: bắt đầu
  5. Invoke-WmiMethod

Từ các thử nghiệm của tôi, gần nhất tôi có thể nhận được là với lệnh sau:

$command = "program.exe -r param" 
Invoke-Command -ComputerName $server -ScriptBlock {$command} 

Lệnh hoàn thành không có lỗi hoặc trả lại mã, nhưng trên máy từ xa, nó không chạy với đối số. Tôi đã chơi xung quanh với dấu nháy đơn/đôi để xem có thay đổi nào, nhưng không có gì.

Trả lời

19

Bạn có thử sử dụng -ArgumentList tham số:

invoke-command -ComputerName studio -ScriptBlock { param ($myarg) ping.exe $myarg } -ArgumentList localhost 

http://technet.microsoft.com/en-us/library/dd347578.aspx

Một ví dụ về cách gọi một chương trình mà không có trong đường dẫn và có một không gian trong đó là đường dẫn thư mục:

invoke-command -ComputerName Computer1 -ScriptBlock { param ($myarg) & 'C:\Program Files\program.exe' -something $myarg } -ArgumentList "myArgValue" 

Nếu giá trị của đối số là tĩnh, bạn chỉ có thể cung cấp nó trong khối tập lệnh như sau:

invoke-command -ComputerName Computer1 -ScriptBlock { & 'C:\Program Files\program.exe' -something "myArgValue" } 
+0

Cảm ơn phản hồi nhanh. Vì lý do nào đó, khi tôi thử nó theo cách đó, tôi làm cho nó in ra lệnh mở rộng sẽ hoạt động nếu tôi chạy nó bằng tay, nhưng nó không thực sự chạy nó. Tôi đã phải loại bỏ "&" vì nó nói nó là một ký tự dành riêng để sử dụng trong tương lai. – gregs

+0

@gregs Tôi phải bật tính năng truy cập từ xa trên máy của mình để kiểm tra. Tôi đã thay đổi lệnh thành một kiểm tra ping đơn giản gửi một đối số của localhost. Sự thành công ở trên đối với tôi. –

+0

Tôi có thể đã tìm ra cách nắm giữ, nhưng không phải là giải pháp. Dòng này hoạt động nếu tôi sử dụng ping.exe và "localhost" làm arg, nhưng tôi phải đặt dấu ngoặc kép quanh đường dẫn thực thi của mình vì đường dẫn có dấu cách. Khi tôi làm điều đó, nó chỉ đơn giản là lặp lại chuỗi của tôi trong báo giá lại cho tôi, nhưng tôi không nghĩ rằng nó chạy. – gregs

-2
$sb = ScriptBlock::Create("$command") 
Invoke-Command -ScriptBlock $sb 

Điều này sẽ hiệu quả và tránh gây hiểu nhầm cho người mới bắt đầu.

3

Bạn có đang cố chuyển các đối số dòng lệnh cho chương trình AS khi bạn khởi chạy không? Tôi đang làm việc trên một cái gì đó ngay bây giờ mà không chính xác điều này, và nó đã được rất nhiều đơn giản hơn tôi nghĩ. Nếu tôi đi vào dòng lệnh và nhập

C:\folder\app.exe/xC:\folder\file.txt 

thì ứng dụng của tôi khởi chạy và tạo tệp trong thư mục được chỉ định với tên được chỉ định.

tôi muốn thực hiện điều này thông qua một kịch bản Powershell trên một máy từ xa, và đã tìm ra rằng tất cả những gì cần thiết để làm được đưa

$s = New-PSSession -computername NAME -credential LOGIN 
    Invoke-Command -session $s -scriptblock {C:\folder\app.exe /xC:\folder\file.txt} 
Remove-PSSession $s 

(Tôi có một bó lệnh tương tự hơn trong phiên giao dịch, đây là chỉ số tối thiểu cần thiết để chạy) chú ý khoảng cách giữa thực thi và đối số dòng lệnh. Nó làm việc cho tôi, nhưng tôi không chắc chắn chính xác cách thức hoạt động của ứng dụng của bạn, hoặc nếu đó là cách bạn truyền đối số cho nó.

* Tôi cũng có thể có ứng dụng của tôi đẩy các tập tin trở lại máy tính cục bộ của riêng tôi bằng cách thay đổi kịch bản-block để

C:\folder\app.exe /x"\\LocalPC\DATA (C)\localfolder\localfile.txt" 

Bạn cần có dấu ngoặc kép nếu tập tin đường dẫn của bạn có một không gian trong đó.

EDIT: trên thực tế, này lớn lên một số vấn đề ngớ ngẩn với Powershell tung ra ứng dụng như một dịch vụ hoặc một cái gì đó, vì vậy tôi đã làm một số tìm kiếm, và đã tìm ra rằng bạn có thể gọi CMD để thực hiện các lệnh cho bạn trên máy tính từ xa. Bằng cách này, lệnh được thực hiện CHÍNH XÁC như thể bạn vừa gõ nó vào một cửa sổ CMD trên máy từ xa. Đặt lệnh trong scriptblock vào dấu ngoặc kép, và sau đó đặt một cmd.exe/C trước khi nó. như thế này:

cmd.exe /C "C:\folder\app.exe/xC:\folder\file.txt" 

giải pháp này đã giải quyết được tất cả các sự cố tôi gặp phải gần đây.

CHỈNH SỬA CHỈNH SỬA: Có nhiều sự cố hơn và đã tìm ra cách tốt hơn để thực hiện.

start-process -filepath C:\folder\app.exe -argumentlist "/xC:\folder\file.txt" 

và điều này không treo cửa sổ đầu cuối của bạn chờ quá trình từ xa kết thúc. Chỉ cần chắc chắn rằng bạn có một cách để chấm dứt quá trình nếu nó không làm điều đó trên riêng của nó. (của tôi không, yêu cầu mã hóa của một đối số khác)

+0

Câu trả lời hay nhất chưa –

-1
$sb = [scriptblock]::create($command) 
+2

Chào mừng bạn đến với StackOverflow! Có lẽ bạn có thể thêm một số lời giải thích, nó có thể hữu ích cho người hỏi câu hỏi. –

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