Thực thi một lệnh được lưu trữ trong một biến từ PowerShell


152

Tôi có một lệnh mà tôi đã xây dựng và lưu trữ trong một biến trong PowerShell. Lệnh này hoạt động nếu tôi thực hiện Write-Host và sao chép và dán vào cmd.execửa sổ tiêu chuẩn .

Làm cách nào để thực thi lệnh này từ bên trong tập lệnh của tôi?

Tôi đã thử một số kết hợp Invoke-Command hoặc Invoke-Expression mà không gặp may.

Đây là cách tôi xây dựng biến:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

Đây là biến số trông như thế nào nếu nó được in ra màn hình:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

Câu trả lời:


206

Đây là một cách khác mà không có Invoke-Expressionnhưng với hai biến (lệnh: chuỗi và tham số: mảng). Việc này ổn với tôi. Giả sử 7z.exelà trong đường dẫn hệ thống.

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

Nếu lệnh được biết (7z.exe) và chỉ các tham số là biến thì điều này sẽ làm

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

BTW, Invoke-Expressionvới một tham số cũng hoạt động với tôi, ví dụ: điều này hoạt động

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

PS Tôi thường thích cách với một mảng tham số vì dễ soạn thảo theo chương trình hơn là xây dựng biểu thức cho Invoke-Expression.


Điều đó thật tuyệt. Nó đang bắt đầu đến với nhau bây giờ. Thay vì 'c: \ temp \ with space \ test1.zip' tôi có thể sử dụng biến $ không? Tôi có cần đặt nó là "" hay '' không?
Travis

Spleting dường như hoạt động như nhau: & $ cmd @prm Nhưng tôi tò mò về lý do tại sao
C2H5OH

44

Hãy thử gọi lệnh của bạn với Invoke-Expression:

Invoke-Expression $cmd1

Đây là một ví dụ hoạt động trên máy của tôi:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iexlà một bí danh cho Invoke-Expression, do đó bạn có thể làm:

iex $cmd1

Để biết danh sách đầy đủ: Truy cập https://ss64.com/ps/ để biết thêm thông tin Powershell.

Chúc may mắn...


Cho tôi biết thuật ngữ '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ log \ logfiles \ w3svc1 \ u_ex100827.log' không được nhận dạng là tên của a cmdlet, hàm, tệp script hoặc chương trình có thể hoạt động. Kiểm tra chính tả của tên hoặc nếu một đường dẫn được bao gồm, xác minh rằng đường dẫn đó là chính xác và thử lại. Tại: dòng: 14 char: 1 + & <<<< $ cmd1
Travis

@Travis: Rất tiếc. ký hiệu là hoạt động nếu không có đối số. Tôi đã cập nhật bài viết với một giải pháp cho lệnh của bạn.
kbrimington

Tôi đã thử invoke-biểu hiện trước đó và nó không hoạt động. Nó phát sinh lỗi: Hằng số xấu: 7. Tại: line: 1 char: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ log \ logfiles \ w3svc1 \ u_ex100827.log Có vẻ như nó đang cố gắng đánh giá nó thay vì thực thi nó.
Travis

@Travis: Có thể 7z.exe không nằm trên đường dẫn của bạn. Xác minh rằng nó nằm trên đường dẫn và / hoặc thử cung cấp tên đường dẫn đầy đủ cho tệp thực thi trong biểu thức của bạn.
kbrimington

1
@Travis: Tôi vừa xác nhận trên hệ thống của mình rằng 7z.exe đã đưa ra lỗi bạn mô tả, chỉ cần gõ từ dấu nhắc lệnh, nhưng với đường dẫn đầy đủ đến 7z.exe (đối với tôi, đó là 'C:\Program Files\7-zip\7z.exe', tôi có thể thực thi 7z.exe.
kbrimington
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.