2014-04-16 34 views
5

Bài đầu tiên vì vậy xin đừng làm tổn thương tôi. Tôi đã tìm kiếm xung quanh nhưng dường như không thể tìm ra cách để làm những gì tôi muốn. Tôi đã thực hiện một kịch bản sao chép một thư mục mà tôi có nhiều máy tính tại \ $ computer \ c $. Trong các thư mục này là một tập tin thực thi chạy .exe. Những gì tôi muốn làm là có Powershell kéo từ cùng một computers.txt mà tôi sử dụng để sao chép các thư mục và sau đó sử dụng psexec để chạy các tập tin thực thi. Tôi có thể làm điều này tất cả bằng tay nhưng kịch bản nó có vẻ là một vấn đề, đây là những gì tôi nghĩ sẽ làm việc nhưng dường như không.Sử dụng Powershell để chạy lệnh Psexec

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\%computer cmd 
    C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

}

+0

Tập lệnh thực tế đã được sao chép và dán chưa? Hoặc chỉ cần gõ lại, có thể với một số lỗi chính tả? – TheMadTechnician

+0

Tôi đã sao chép/dán nó. Tôi rất mới làm quen với kịch bản trong Powershell, xin lỗi nếu cú ​​pháp là không may. – noz3r0

+0

cố gắng không sử dụng psexec với powershell, tôi có rất nhiều vấn đề về điều này ... –

Trả lời

8

Ok, hãy lấy từ đầu rồi.

$computers = gc "C:\scripts\computers.txt" 

Điều đó tải nội dung của tệp "computers.txt" vào biến $computers. Đủ đơn giản, không có vấn đề ở đó.

Tiếp theo chúng tôi có vòng lặp ForEach. Nó chia nhỏ nội dung của $computers và xử lý mỗi dòng (có lẽ là tên của máy tính) là $computer đối với tất cả mã trong dấu ngoặc nhọn.

foreach ($computer in $computers) { 

Vòng lặp đó bắt đầu với câu lệnh If-Then chuẩn. Nếu (condition) thì {do stuff}. Trong trường hợp này, nó đang kiểm tra xem liệu $computer có khả dụng trên mạng hay không. Nếu có, thì nó cố gắng chạy PSExec trên đó. Nếu nó không trực tuyến, nó chạy mệnh đề Else, chúng ta sẽ nhận được điều đó trong một giây.

if (test-Connection -Cn $computer -quiet) { 

Sau đó, thư sẽ thay đổi thư mục. Loại vô nghĩa, nhưng ok, bất cứ điều gì. Bạn có thể chỉ cần gọi nó một cách rõ ràng, chẳng hạn như C:\PSTools\PSExec.exe <arguments> và lưu một dòng, nhưng thực sự không có hại gì được thực hiện.

cd C:\pstools 

Sau đó, bạn đang gọi PSExec, mặc dù có một lỗi cú pháp nhỏ ở đây. Nó phải là $computer và không phải là %computer. Ngoài ra, nó chỉ cần có lệnh bạn muốn thực thi, không phải là cmd và lệnh trên dòng thứ hai. Bạn có thể có kết quả tốt hơn nếu bạn sử dụng toán tử Gọi (&) để làm cho PowerShell nhận ra rằng nó đang cố gắng thực thi một cái gì đó và không chạy lệnh ghép ngắn hoặc chức năng hay không.

& psexec \\$computer C:\Folder\install.bat 

Sau đó là mệnh đề khác cho biết nếu máy tính không trực tuyến để viết chuỗi "$ máy tính không trực tuyến", sau đó đóng dấu ngoặc cho mệnh đề Khác và vòng lặp ForEach.

} else { 
    "$computer is not online" 
} 


} 

Edit: Ok, kịch bản đã hoàn thành của bạn sẽ giống như thế này (kèm theo mục tiêu trong dấu ngoặc kép trong trường hợp có nhiều không gian trong đường dẫn):

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
    if (test-Connection -Cn $computer -quiet) { 
     & C:\pstools\psexec.exe \\$computer "C:\folder\install.bat" 
    } else { 
     "$computer is not online" 
    } 
} 
+0

Ok tôi thấy cách tôi có thể thu nhỏ lại một chút. Cảm ơn bạn đã chia tay đầy đủ. Vấn đề của tôi bây giờ là tôi không thể làm cho hàm Psexec hoạt động chính xác và tôi không chắc mình đang làm gì sai. Nếu tôi đã làm điều này bằng tay tôi sẽ mở ra một dấu nhắc lệnh và gõ 'psexec \\ tên máy chủ cmd' sau đó tôi sẽ có trong dấu nhắc lệnh máy đó, từ đó tôi chỉ có thể điều hướng đến thư mục tôi muốn và chạy tập tin thực thi . – noz3r0

+0

Bạn có chắc là nó không hoạt động? PSExec sẽ ném một lỗi nếu bạn chạy nó trong PowerShell ISE, và vẫn hoạt động. Có một lý do cho nó, và nó phải làm gì với cách PSExec xuất dữ liệu, và một số của nó là đầu ra cho luồng đầu ra tiêu chuẩn, và một số của nó là đầu ra cho luồng lỗi. Bất kể, bạn có chắc chắn rằng nó không hoạt động? – TheMadTechnician

+0

Tôi thấy bạn đã ném một bản chỉnh sửa lên đó, kịch bản cuối cùng của tôi không giống như những gì bạn có, tôi sẽ đưa nó vào buổi sáng và cho bạn biết. Nó có vẻ như nó nên làm việc mặc dù. Cảm ơn vì sự tích cực của bạn. – noz3r0

1

này cung cấp cho một thử. Bạn có một số % nơi bạn muốn có một số $. Ngoài ra cuộc gọi cmd.exe là không cần thiết.

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\$computer "C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

} 
+0

báo động sai. Nó sẽ không chạy psexec như thế, nói rằng nó không phải là một lệnh hợp lệ. Có một lệnh để chạy thực thi? – noz3r0

0

sử dụng & (cuộc gọi) điều hành, & psexec \ $ máy tính "C: \ Folder \ install.bat "

4

Tôi nhận ra câu hỏi này là từ năm 2014 và câu trả lời này sẽ không trực tiếp giải quyết câu hỏi mà người dùng đã hỏi. Nhưng đối với những người gặp phải câu hỏi này, tôi muốn ném ra ngoài đó bạn không cần * để sử dụng PSExec nếu bạn đang sử dụng PowerShell. Kể từ khi bạn đã có trong PowerShell, chỉ cần sử dụng Invoke-Command.

Cú pháp sẽ là

Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat } 

Nó thực sự dễ dàng.

* Yêu cầu PowerShell remoting được kích hoạt trên máy chủ đích.

+1

Đây là tổng quá đơn giản. Nếu install.bat cần phải tăng gấp đôi, điều này sẽ không hoạt động. –

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