2009-12-16 27 views
11

Tôi đang cố gắng để chạy một lệnh Powershell để gọi 7-Zip để nén lên một thư mục bằng cách sử dụng lệnh sau:Invoke-Biểu hiện với exe trong Program Files

$command = $SevenZip + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName 
Invoke-Expression $command 

Các biến được đưa vào $ command là đã được đặt và $ SevenZip là "c: \ Program Files \ 7-Zip \ 7z.exe"

Điều này không hiệu quả và tôi đang cố gắng tìm ra cách tốt nhất để gọi 7-Zip từ Powershell. Ý tưởng?

Trả lời

21

Tôi đã có cùng một vấn đề trước đây. Đây là mã (gần như) trực tiếp từ một kịch bản sao lưu mà tôi hiện đang sử dụng:

[string]$pathToZipExe = "C:\Program Files\7-zip\7z.exe"; 
[Array]$arguments = "a", "-tgzip", $outputFilePath, $inputFilePath; 

& $pathToZipExe $arguments; 

tôi đã nhận được vào các thói quen của việc sử dụng một mảng tranh cãi với các nhà điều hành cuộc gọi, Nó có vẻ là mạnh hơn so với các phương pháp khác.

+0

Cảm ơn bạn! Hoàn hảo. – onupdatecascade

+0

Bất kỳ cách nào để lấy mã trả về từ exe? – Robin

3

Bạn thực sự không cần Invoke-Expression. Bạn có thể chỉ cần gọi lệnh bằng cách sử dụng ký hiệu và chẳng hạn như:

&$Command 

Nhưng cũng có lệnh ghép ngắn bắt đầu có thể phù hợp hơn với những gì bạn đang cố gắng làm. Bằng cách thực hiện lệnh dưới dạng chuỗi ở trên, bạn dễ bị lỗi nếu $ SevenZip chứa dấu cách và không được trích dẫn. Thay vào đó, tôi sẽ sử dụng:

Start-Process $SevenZip "...rest..." 
1

Hãy để tôi đoán, nó đang cố gắng gọi "c: \ Program"?

Không chắc chắn về cú pháp chính xác cho PS, nhưng bạn sẽ cần phải làm điều gì đó về không gian đó.

+1

đúng - đó là chính xác những gì nó đang cố gắng để làm ... – Guy

6

Bạn không cần sử dụng Gọi biểu thức chỉ cần sử dụng toán tử gọi (gọi) & để gọi một chuỗi có tên lệnh để thực hiện. Lưu ý rằng bạn muốn giữ riêng các thông số trong trường hợp này, tức là chuỗi SevenZip chỉ là đường dẫn đến EXE, ví dụ:

&$SevenZip a "$targetDirForZip$GetDateName_$($dir.Name).7z" $dir.FullName 
0

trình cho tôi:

$command = "& ""$SevenZip""" + " a " + $targetDirForZip + $GetDateName + "_" + $dir.Name + ".7z " + $dir.FullName 

Write-Host "Running: $command" 

Invoke-Expression $command 
2

Tôi chạy vào vấn đề này là tốt, đây là giải pháp của tôi.

invoke-expression "& 'C:\Program Files\CIESetupClient\Staging\ffd4bc34-52c1-43e7-92d4-93d2f59d7f52\vstor_redist.exe' /q /norestart /log c:\Logs\VSTOR_Redist.log " 

tôi đã có thể rời khỏi paramaters của tôi bên ngoài các dấu nháy đơn trỏ đến exe của tôi, tôi nghĩ rằng đây có lẽ là cách dễ nhất để gọi một exe với các thông số sử dụng gọi thể hiện.

+0

giải pháp tốt mà làm việc cho tôi – lara400

0

Bạn cũng có thể sử dụng lệnh MS-DOS từ bên trong tập lệnh Windows PowerShell.

Tôi luôn yêu thích lệnh START của CMD.exe, cho phép bạn bắt đầu lệnh song song.

Vì vậy, để bắt đầu 7-zip của bạn, đặt lệnh sau đây trong kịch bản Powershell của bạn:

cmd.exe /c start <your 7-zip command like in MS-DOS> 
+0

câu trả lời này không giúp đỡ bằng cách nào để giải quyết vấn đề –

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