Tôi có thể nhận && để làm việc trong Powershell không?


185

&&nổi tiếng là khó tìm kiếm trên google, nhưng tốt nhất tôi tìm thấy là bài viết này nói về việc sử dụng -and.

Thật không may, nó không cung cấp thêm thông tin nào và tôi không thể tìm ra những gì tôi phải làm với -and(một lần nữa, một điều rất khó tìm kiếm)

Bối cảnh tôi đang cố gắng sử dụng nó là "thực thi cmd1 và nếu thành công, hãy thực thi cmd2", về cơ bản là:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

Đây sẽ là một vài điểm rep dễ dàng cho một người biết, cảm ơn!


Chỉnh sửa: Nếu bạn chỉ muốn chạy nhiều lệnh trên một dòng và bạn không quan tâm liệu lệnh đầu tiên có thất bại hay không, bạn có thể sử dụng ;cho hầu hết các mục đích của tôi, điều này tốt

Ví dụ : kill -n myapp; ./myapp.exe.


PowerShell có các toán tử logic -and và -or. Có phải các nhà khai thác không làm việc theo cách bạn mong đợi? Nếu vậy, bạn có thể đăng biểu thức ở đây.
Mohit Chakraborty

Xem câu hỏi này, nó thực hiện những gì bạn muốn: stackoverflow.com/questions/1917271/
Khăn

2
Bất cứ ai quan tâm đến phong cách Bash &&||trở thành một phần của PowerShell: vui lòng bỏ phiếu cho tính năng này tại đây .
mkuity0

1
Về nhu cầu thực hiện tìm kiếm trên web cho các truy vấn có ký hiệu bằng chữ (và có ý nghĩa): SymbolHound rất hữu ích cho việc này. Dưới đây là một số ví dụ liên quan đến câu hỏi: powershell && ; quyền hạn -and . Nếu bạn sử dụng DuckDuckGo , bạn có thể tìm kiếm SymbolHound qua !sym.
nisavid

3
Cập nhật tháng 6 năm 2019 : Nhóm PowerShell đang triển khai &&||! Cân nhắc tại GitHub PR
pilau

Câu trả lời:


192

Trong CMD, '&&' có nghĩa là "thực thi lệnh 1 và nếu thành công, hãy thực thi lệnh 2". Tôi đã sử dụng nó cho những thứ như:

build && run_tests

Trong PowerShell, điều gần nhất bạn có thể làm là:

(build) -and (run_tests)

Nó có cùng logic, nhưng văn bản đầu ra từ các lệnh bị mất. Có lẽ nó là đủ tốt cho bạn, mặc dù.

Nếu bạn đang làm điều này trong một kịch bản, có lẽ bạn sẽ tốt hơn khi tách các câu lệnh, như thế này:

build
if ($?) {
    run_tests
}

27/11/11/27 : Nhà &&điều hành hiện có sẵn cho PowerShell 7 Preview 5+ :

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
RE: "nực cười là họ sẽ xóa" - Tôi không muốn nghĩ PowerShell là "CMD với các phần ngu ngốc bị xóa". is.gd/k92B
Jay Bazuzi

90
Tôi không muốn nghĩ PowerShell là "CMD với những phần ngu ngốc bị loại bỏ". Tôi thích nghĩ về nó như là "Bash mà không có bất kỳ bit hữu ích nào".
Pod

15
Bạn cũng có thể làm build ; if ($?) { run_tests }trên dòng lệnh quá.
docwhat

19
Cách nhanh nhất để thực sự thất vọng khi học PowerShell là bắt đầu bằng cách nghĩ rằng đó chỉ là một bản mở rộng hoặc bash. Nó có một mô hình cơ bản khác nhau, epecially khi nói đến đầu vào, đầu ra, đường ống, và kết quả. Bắt đầu với một hướng dẫn hoặc tổng quan tốt và đừng quá cố gắng để làm cho cú pháp từ các shell khác hoạt động. Bạn phải thực hiện nó theo các điều khoản riêng của nó.
Mark Meuer

3
Lấy PowerShell theo các thuật ngữ riêng, làm cách nào để chạy lệnh và sau đó, chỉ khi lệnh đó thành công, hãy chạy lệnh khác? Tôi không nghĩ đó là những bashý tưởng áp đặt trên PowerShell. Đó là chức năng vỏ cơ bản. Cho đến nay, thứ tốt nhất tôi từng thấy là build ; if ($?) { run_tests }từ bây giờ tôi sẽ sử dụng. Tôi hy vọng nhóm PowerShell thêm &&hỗ trợ!
Nate

28

&& và || nằm trong danh sách những thứ cần thực hiện (vẫn còn) nhưng không bật lên như là thứ hữu ích nhất tiếp theo để thêm vào. Lý do là chúng ta có -AND và -OR. Nếu bạn nghĩ nó quan trọng, vui lòng gửi đề xuất trên Connect và chúng tôi sẽ xem xét nó cho V3.


11
Tôi đã đăng ký trên Connect và đã tự đề cử cho mình quyền hạn, nhưng tôi không thể tìm ra cách đặt đề xuất. Trang web Connect thực sự phức tạp và khó hiểu :-(
Orion Edwards

6
Tôi không thể tìm thấy một yêu cầu có sẵn vì vậy tôi đã thực hiện một yêu cầu: connect.microsoft.com/PowerShell/feedback/details/778798/ mẹo
Andy Arismendi

22
Bạn biết đấy, câu hỏi vẫn là làm thế nào để viết một từ tương đương và câu trả lời của bạn sẽ hữu ích hơn rất nhiều nếu bạn thêm một ví dụ về việc sử dụng -AND
Kyeotic

5
Điều này quan trọng vì đây là công cụ kiểm soát dòng chảy cơ bản được sử dụng trên các hệ thống cũ hơn cửa sổ gần như vĩnh cửu. Vì vậy, trình bày YET ANOTHER phá vỡ sự khác biệt giữa linux và windows.
airtonix

6
Tôi hy vọng Jeffrey Snover đang lắng nghe, SO này sẽ đủ lý do để thực hiện nó ngay bây giờ. Đã quá lâu và giờ PowerShell bắt đầu bật lên ở những nơi, như VSCode sử dụng nó làm thiết bị đầu cuối mặc định trong Windows. Đây là nỗi đau hoàn toàn không có &&, -andđầu ra ăn, không tương đương chút nào.
Ciantic

13

Thử cái này:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

9
Lưu ý: Nếu lệnh đầu tiên thất bại, lệnh thứ hai vẫn sẽ chạy.
BrunoLM

4
Biến ưu tiên $ErrorActionPreferencechỉ chi phối cách xử lý các lỗi không kết thúc được báo cáo bởi các lệnh ghép ngắn ; tiện ích bên ngoài như csca.exekhông bao giờ báo cáo lỗi này (họ chỉ phản ánh trạng thái thoát của họ trong $?(cờ thành công) và $LASTEXITCODE(mã cụ thể thoát được báo cáo)), do đó lượng dòng lệnh của bạn để vô điều kiện thực hiện cả lệnh (tương đương với cmd's csc /t:exe /out:a.exe SomeFile.cs & a.exe)
mkuity0

5

Nếu lệnh của bạn có sẵn trong cmd.exe (đại loại như python ./script.pynhưng không phải lệnh PowerShell như ii .(Điều này có nghĩa là mở thư mục hiện tại bằng explorer)), bạn có thể chạy cmd.exe trong PowerShell. Cú pháp như thế này:

cmd /c "command1 && command2"

Ở đây, &&được cung cấp bởi cú pháp cmd được mô tả trong câu hỏi này .


4
Đẹp, nâng cấp lên cmd để truy cập chức năng bổ sung của nó.
Bill K

4

Tôi đã thử chuỗi lệnh này trong PowerShell:

Kiểm tra Fisrt

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null)trở thành sự thật(Get-Content $MyVar)cũng trở thành sự thật .

Thử nghiệm thứ hai

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null)trả lại sai và cho đến nay tôi phải giả sử (Get-Content $MyVar)cũng trả lại sai .

Thử nghiệm thứ ba đã chứng minh điều kiện thứ hai thậm chí không được phân tích.

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null)trả về false và chứng minh điều kiện thứ hai (Get-Content "C:\MyTxt.txt")không bao giờ chạy, bằng cách trả về false trên toàn bộ lệnh.


Bạn đúng rồi! điều này hoạt động như toán tử &&. Ngay cả một $ () ở bên phải cũng sẽ không cho phép đánh giá điều này!
Falco Alexander

2

Câu hỏi rất cũ, nhưng đối với người mới: có thể phiên bản PowerShell (tương tự nhưng không tương đương ) mà câu hỏi đang tìm kiếm, là sử dụng -andnhư sau:

(build_command) -and (run_tests_command)


1
Điều này có thể ổn cho trường hợp sử dụng của bạn, nhưng nó không hoạt động như thế &&, vì nó bỏ qua mã thoát của build_command.
Simon Buchan

Điều này chắc chắn không làm điều đúng. Nó sẽ chạy lệnh thứ hai ngay cả khi lệnh đầu tiên thất bại.
Nate

Điều này là hoàn toàn sai. ;là tương đương với &cmd và ;trong bash. Nó chắc chắn không giống như &&trong cmd
phuclv

Nó cũng tắt tiếng STDOUT và STDERR cho cả hai quá trình.
Dragas

0

Nó phụ thuộc vào ngữ cảnh, nhưng đây là một ví dụ về "-và" trong hành động:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

Vì vậy, đó là nhận được tất cả các tệp lớn hơn 10kb trong một thư mục có tên tệp bắt đầu bằng "f".


1
Đây không phải là một câu trả lời cho câu hỏi ban đầu, mà là về việc thực hiện nhiều lệnh.
bdukes

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

Nó dài hơn một chút so với "&&" nhưng hoàn thành điều tương tự mà không cần kịch bản và không quá khó nhớ. Muộn còn hơn không. :)


2
Start-Processlà công cụ sai để sử dụng để gọi các tiện ích dòng lệnh nói chung. Cụ thể, như được sử dụng ở đây, Start-Processchạy filename1.exekhông đồng bộ trong cửa sổ giao diện điều khiển mới và không trả về , trong bối cảnh Boolean ước tính $false. Ngay cả khi bạn đã bỏ qua Start-Process(đó là cách bạn nên gọi các tiện ích dòng lệnh - trực tiếp), cách tiếp cận sẽ bị thiếu, bởi vì kết quả của điều kiện sau đó phụ thuộc vào việc tiện ích có tạo ra bất kỳ đầu ra đầu ra nào, không có mối quan hệ được đảm bảo với việc nó Thành công hay không.
mkuity0

0

Tôi nghĩ rằng một tuyên bố đơn giản nếu có thể thực hiện điều này. Khi tôi thấy phản hồi của mkelement0 ở trên rằng trạng thái thoát cuối cùng được lưu trữ trong $?, Tôi kết hợp các phần sau:

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

Vì vậy, với ví dụ của op, nó sẽ là:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

0

Một tương đương dài dòng là kết hợp $LASTEXITCODE-eq 0:

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

Tôi không chắc tại sao if ($?)không làm việc cho tôi, nhưng điều này đã làm.


-1

Chúng ta có thể thử lệnh này thay vì sử dụng phương thức &&

thử {tên máy chủ; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} bắt {echo err} cuối cùng {}


Không cần try/ catch, vì chỉ cần chấm dứt lỗi, những tiện ích bên ngoài như hostname, ipconfigfindstrkhông thể kích hoạt. Việc kiểm tra $LASTEXITCODEchỉ cần thiết nếu bạn muốn biết mã thoát cụ thể được thiết lập bởi một tiện ích bên ngoài - thành công hay thất bại trừu tượng được phản ánh $?, giống như với các lệnh ghép ngắn gốc.
mkuity0

Tôi nghĩ rằng @Cyberiron đang đi đúng hướng. Tôi nghĩ rằng &&trong Unix rất giống với thử / bắt ở chỗ nó không yêu cầu bạn phải bọc các lệnh tiếp theo trong một khối mới (tức là }) khi bạn ngắn mạch các lệnh sau (bỏ qua chúng). Tôi nghĩ rằng một AmpAmpchức năng / bộ lọc sẽ ném khi nào if (!?) { throw "last command failed" }sẽ là sự thay thế rất hữu ích để chuyển &&sang PowerShell. cách sử dụng :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
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.