Trích xuất tên tệp từ một đường dẫn


83

Tôi muốn trích xuất tên tệp từ đường dẫn dưới đây:

D: \ Server \ User \ CUST \ MEA \ Data \ In \ Files \ CORRECTED \ CUST_MEAFile.csv

Bây giờ tôi đã viết mã này để lấy tên tệp. Điều này hoạt động tốt miễn là cấp thư mục không thay đổi. Nhưng trong trường hợp cấp độ thư mục đã được thay đổi, mã này cần phải viết lại. Tôi đang tìm cách để làm cho nó linh hoạt hơn chẳng hạn như mã luôn có thể trích xuất tên tệp bất kể cấp thư mục.

($outputFile).split('\')[9].substring(0)

Câu trả lời:


164

Nếu bạn đồng ý với việc bao gồm phần mở rộng, điều này sẽ làm những gì bạn muốn.

$outputPath = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$outputFile = Split-Path $outputPath -leaf

6
Đây là một câu trả lời tuyệt vời. Nó giải quyết vấn đề theo cách "tích hợp sẵn" nhất. Tuy nhiên, đối với nhu cầu của tôi, tôi cần cả tên tệp có phần mở rộng và tên tệp cơ sở, vì vậy tôi đã sử dụng câu trả lời của @ angularsen. Có một tham số khác, -leafbase, nhưng nó chỉ được hỗ trợ trên PowerShell Core 6+.
Jamie

62

Sử dụng :

[System.IO.Path]::GetFileName("c:\foo.txt")lợi nhuận foo.txt. [System.IO.Path]::GetFileNameWithoutExtension("c:\foo.txt")trả lạifoo


16

Sử dụng BaseName trong Get-ChildItem hiển thị tên của tệp và sử dụng Tên hiển thị tên tệp có phần mở rộng.

$filepath = Get-ChildItem "E:\Test\Basic-English-Grammar-1.pdf"

$filepath.BaseName

Basic-English-Grammar-1

$filepath.Name

Basic-English-Grammar-1.pdf

4

Bạn có thể nhận được kết quả bạn muốn như thế này.

$file = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$a = $file.Split("\")
$index = $a.count - 1
$a.GetValue($index)

Nếu bạn sử dụng "Get-ChildItem" để lấy "tên đầy đủ", bạn cũng có thể sử dụng "name" để chỉ lấy tên của tệp.


6
Đơn giản chỉ cần sử dụng các chỉ số -1nếu bạn đang dùng phương pháp mảng:$file.Split("\")[-1]
Ansgar Wiechers

Nếu muốn xóa tiện ích mở rộng, chúng ta có thể làm gì?
Souradeep Banerjee-AIS

4
Get-ChildItem "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
|Select-Object -ExpandProperty Name

3

Chỉ để hoàn thành câu trả lời ở trên sử dụng .Net.

Trong mã này, đường dẫn được lưu trữ trong %1đối số (được viết trong sổ đăng ký dưới trích dẫn được thoát \"%1\":). Để truy xuất nó, chúng ta cần $arg(inbuilt arg). Đừng quên câu trích dẫn xung quanh $FilePath.

# Get the File path:  
$FilePath = $args
Write-Host "FilePath: " $FilePath

# Get the complete file name:
$file_name_complete = [System.IO.Path]::GetFileName("$FilePath")
Write-Host "fileNameFull :" $file_name_complete

# Get File Name Without Extension:
$fileNameOnly = [System.IO.Path]::GetFileNameWithoutExtension("$FilePath")
Write-Host "fileNameOnly :" $fileNameOnly

# Get the Extension:
$fileExtensionOnly = [System.IO.Path]::GetExtension("$FilePath")
Write-Host "fileExtensionOnly :" $fileExtensionOnly

3
$(Split-Path "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv" -leaf)

3

Bạn có thể thử điều này:

[System.IO.FileInfo]$path = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
# Returns name and extension
$path.Name
# Returns just name
$path.BaseName

2

Tìm tệp bằng ký tự đại diện và lấy tên tệp:

Resolve-Path "Package.1.0.191.*.zip" | Split-Path -leaf

1
$file = Get-Item -Path "c:/foo/foobar.txt"
$file.Name

Hoạt động với cả hai đường dẫn tương đối và đường dẫn tuyệt đối

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.