Bạn chỉ cần chọn thuộc tính bạn muốn từ các đối tượng. FullName
trong trường hợp này.
$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)} | foreach {$_.FullName}
Chỉnh sửa: "? Nào foreach làm gì là những gì mà liệt kê trên" Giải thích cho Mark, người yêu cầu,
Lời giải thích của Sung Meister rất tốt, nhưng tôi sẽ thêm hướng dẫn tại đây vì nó có thể hữu ích.
Khái niệm chính là đường dẫn. Hình ảnh một loạt các quả bóng pingpong lăn xuống một cái ống hẹp sau cái kia. Đây là những đối tượng trong đường ống. Mỗi giai đoạn của đường ống - các đoạn mã được phân tách bằng ký tự ống (|) - có một đường ống đi vào nó và đường ống thoát ra khỏi nó. Đầu ra của một giai đoạn được kết nối với đầu vào của giai đoạn tiếp theo. Mỗi giai đoạn đưa các đối tượng khi chúng đến, làm mọi thứ với chúng, và gửi chúng trở lại vào đường ống đầu ra hoặc gửi ra các đối tượng mới, thay thế.
Get-ChildItem $directory -Recurse
Get-ChildItem hướng dẫn từng tệp và thư mục gặp và đặt chúng vào đường ống.
Select-Object FullName
Select-Object mất từng đối tượng FileSystemInfo như nó đến, lấy tài sản FullName từ nó (đó là một con đường trong trường hợp này), đặt tài sản đó thành một thương hiệu đối tượng tùy chỉnh mới nó đã tạo ra, và đặt mà tùy chỉnh đối tượng ra vào đường ống.
Where-Object {!($_.psiscontainer)}
Đây là bộ lọc. Phải mất mỗi đối tượng, kiểm tra nó, và gửi nó trở lại hoặc loại bỏ nó tùy thuộc vào một số điều kiện. Mã của bạn ở đây có một lỗi, bằng cách này. Các đối tượng tùy chỉnh đến đây không có thuộc tính psiscontainer. Giai đoạn này không thực sự làm bất cứ điều gì. Mã của Sung Meister tốt hơn.
foreach {$_.FullName}
Foreach, có tên dài là ForEach-Object, lấy mỗi đối tượng khi đến, và ở đây, lấy thuộc tính FullName, một chuỗi, từ đó. Bây giờ, đây là phần tinh tế: Bất kỳ giá trị nào không được tiêu thụ, nghĩa là, không bị bắt bởi một biến hoặc bị chặn theo một cách nào đó, được đưa vào đường dẫn đầu ra. Là một thử nghiệm, hãy thử thay thế giai đoạn đó bằng cách này:
foreach {'hello'; $_.FullName; 1; 2; 3}
Thực sự dùng thử và kiểm tra đầu ra. Có bốn giá trị trong khối mã đó. Không ai trong số họ được tiêu thụ. Lưu ý rằng tất cả chúng đều xuất hiện trong đầu ra. Bây giờ hãy thử điều này:
foreach {'hello'; $_.FullName; $ x = 1; 2; 3}
Lưu ý rằng một trong các giá trị đang được ghi lại bởi một biến. Nó không xuất hiện trong đường dẫn đầu ra.
foreach làm gì? Cái gì đang liệt kê? –
Một giải pháp tốt hơn là sử dụng select-object -expand FullName –
FYI, bạn có thể gán cho một biến _and_ phát ra đầu ra bằng cách sử dụng 'tee-object'. Ví dụ: 'ls | select-first full -property fullname | % {$ _. FullName} | tee -variable firstpath' –