Ich muss den Dateinamen und die Dateierweiterung von z. my.file.xlsx. Ich kenne den Dateinamen oder die Dateierweiterung nicht und der Name enthält möglicherweise mehr Punkte. Daher muss ich die Zeichenfolge von rechts durchsuchen und, wenn ich den ersten Punkt (oder den letzten von links) finde, den Teil auf der Seite extrahieren rechte Seite und der Teil auf der linken Seite von diesem Punkt.
Vielleicht gibt es eine bessere Lösung, aber ich habe hier oder anderswo nichts gefunden. Vielen Dank
Wenn die Datei von der Festplatte kommt und wie andere angegeben haben, verwenden Sie die Eigenschaften BaseName
und Extension
:
PS C:\> dir *.xlsx | select BaseName,Extension
BaseName Extension
-------- ---------
StackOverflow.com Test Config .xlsx
Wenn Sie den Dateinamen als Teil einer Zeichenfolge erhalten (z. B. aus einer Textdatei), würde ich die statischen Methoden GetFileNameWithoutExtension
und GetExtension
aus System.IO.Path) verwenden Klasse:
PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
Test Config
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
.xlsx
PS C:\Windows\System32\WindowsPowerShell\v1.0>split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf
tp-mkt-SPD-38.4.10.msi
PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable
Name Value
---- -----
CLRVersion 2.0.50727.5477
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
Wenn es sich um eine Textdatei handelt und die mutmaßliche Namensdatei von Leerzeichen umgeben ist, haben Sie folgende Möglichkeiten:
$a = get-content c:\myfile.txt
$b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value
$b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }
Wenn es sich um eine Datei handelt, können Sie je nach Bedarf Folgendes verwenden:
$a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx
$a
Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 25/01/10 11.51 624 my.file.xlsx
$a.BaseName
my.file
$a.Extension
.xlsx
Überprüfen Sie die Eigenschaften BaseName und Extension des FileInfo-Objekts.
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type
Benutze Split-Path
$filePath = "C:\PS\Test.Documents\myTestFile.txt";
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];
mach es einfach:
$file=Get-Item "C:\temp\file.htm"
$file.Name
$file.Extension
Dies ist eine Anpassung, wenn jemand neugierig ist. Ich musste testen, ob RoboCopy eine Datei erfolgreich auf mehrere Server kopiert hat, um die Integrität zu gewährleisten:
$Comp = get-content c:\myfile.txt
ForEach ($PC in $Comp) {
dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName
}
Schön und einfach, und es zeigt das Verzeichnis und die Datei darin. Wenn Sie einen Dateinamen oder eine Dateierweiterung angeben möchten, ersetzen Sie einfach die * durch die von Ihnen gewünschten.
Directory: \\SERVER\Folder\Share
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2/27/2015 5:33 PM 1458935 Test.pptx