Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在从PowerShell中的文件名中删除路径和扩展名_Powershell - Fatal编程技术网

正在从PowerShell中的文件名中删除路径和扩展名

正在从PowerShell中的文件名中删除路径和扩展名,powershell,Powershell,我有一系列字符串,它们是文件的完整路径。我想只保存文件名,不保存文件扩展名和前导路径。因此: c:\temp\myfile.txt 到 实际上,我并不是在遍历目录,在这种情况下,可以使用PowerShell的basename属性,而是单独处理字符串。有一个方便的.NET方法: C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt") myfile 您可以使用basename属性 PS II> ls *.

我有一系列字符串,它们是文件的完整路径。我想只保存文件名,不保存文件扩展名和前导路径。因此:

c:\temp\myfile.txt


实际上,我并不是在遍历目录,在这种情况下,可以使用PowerShell的
basename
属性,而是单独处理字符串。

有一个方便的.NET方法:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile

您可以使用basename属性

PS II> ls *.ps1 | select basename

,

这里是另一个选择:

PS II> $f="C:\Downloads\ReSharperSetup.7.0.97.60.msi"

PS II> $f.split('\')[-1] -replace '\.\w+$'

PS II> $f.Substring(0,$f.LastIndexOf('.')).split('\')[-1]
灵感来源于@walid2mi:

(Get-Item 'c:\temp\myfile.txt').Basename

请注意:这仅在给定文件确实存在时有效。

这里有一个没有括号的文件

[io.fileinfo]“c:\temp\myfile.txt”|%basename

解决显示完整路径、目录、文件名或文件扩展名的问题比我想象的要简单

$PSCommandPath
(Get-Item $PSCommandPath ).Extension
(Get-Item $PSCommandPath ).Basename
(Get-Item $PSCommandPath ).Name
(Get-Item $PSCommandPath ).DirectoryName
(Get-Item $PSCommandPath ).FullName
$ConfigINI = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".ini"
$ConfigINI
其他形式:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
split-path -parent $PSCommandPath
Split-Path $script:MyInvocation.MyCommand.Path
split-path -parent $MyInvocation.MyCommand.Definition
[io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)

给定任意路径字符串,System.IO.path对象上的各种静态方法将给出以下结果

strTestPath = C:\Users\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD\PathStringInfo.ps1 GetDirectoryName = C:\Users\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD GetFileName = PathStringInfo.ps1 GetExtension = .ps1 GetFileNameWithoutExtension = PathStringInfo

编写和测试生成的脚本,其中包含了关于PuxBek与C语言、C语言、C++语言、Windows NT命令脚本语言以及其他任何我有经验的事物的一些不同之处。

< P>可以通过多次分割字符串来完成。
#Path
$Link = "http://some.url/some/path/file.name"

#Split path on "/"
#Results of split will look like this : 
# http:
#
# some.url
# some
# path
# file.name
$Split = $Link.Split("/")

#Count how many Split strings there are
#There are 6 strings that have been split in my example
$SplitCount = $Split.Count

#Select the last string
#Result of this selection : 
# file.name
$FilenameWithExtension = $Split[$SplitCount -1]

#Split filename on "."
#Result of this split : 
# file
# name
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")

#Select the first half
#Result of this selection : 
# file
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]

#The filename without extension is in this variable now
# file
$FilenameWithoutExtension
以下是无注释的代码:

$Link = "http://some.url/some/path/file.name"
$Split = $Link.Split("/")
$SplitCount = $Split.Count
$FilenameWithExtension = $Split[$SplitCount -1]
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]
$FilenameWithoutExtension

从PowerShell 6开始,您将获得不带扩展名的文件名,如下所示:

split-path c:\temp\myfile.txt -leafBase

此脚本在文件夹和子文件夹中搜索,并通过删除扩展名重命名文件

Get ChildItem-Path“C:/”-Recurse-Filter*.wctc|
Foreach对象{
重命名项$\u0.fullname-newname$\u0.basename
}

根据RenéNyffenegger的回答展开,对于那些无法访问PowerShell 6.x版的用户,我们使用Split Path,它不测试文件是否存在:

Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf
这将返回“myfile.txt”。如果我们知道文件名中没有句点,我们可以拆分字符串并取第一部分:

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.') | Select -First 1

这将返回“myfile”。 如果文件名可能包含句点,为了安全起见,我们可以使用以下内容:

$FileName = Split-Path "C:\Folder\SubFolder\myfile.txt.config.txt" -Leaf
$Extension = $FileName.Split('.') | Select -Last 1
$FileNameWoExt = $FileName.Substring(0, $FileName.Length - $Extension.Length - 1)
这将返回“myfile.txt.config”。
在这里,我更喜欢使用Substring()而不是Replace(),因为前面带有句点的扩展名也可能是名称的一部分,如我的示例所示。通过使用Substring,我们返回文件名,但不返回请求的扩展名

下面的命令将把文件夹中的所有文件存储在一个变量中,与扩展名“.txt”匹配:

$file
提供文件的路径、名称和扩展名:c:\temp\myfile.txt

$file.name
提供文件名和扩展名:myfile.txt



$file.basename
只给出文件名:myfile

操作说明:我实际上没有遍历目录。第二个示例不太适用于类似“C:\Downloads\ReSharperSetup.7.0.97.60.msi”这样的内容。拆分('\.')[-2]@KeithHill专业文件名除了我收集的扩展名的点之外没有其他点。但这有待讨论。如果一个人慷慨大方,他会假设扩展名为三个字符,因此我会
$filenamewext=$FileName.Substring(0,$FileName.Length-4)
“他会假设扩展名为三个字符”不是一个好的假设。有很多扩展使用多于或少于三个字符,例如:.psd1、.psm1、.json、.docx、.xslx、.pptx、.appx、.appbundle、.cs、.fs、.c、.h、.py等。许多答案没有考虑问题的第二部分。当使用Get Item、Get ChildItem或其别名ls、dir、gi、gci时,测试字符串中的文件必须存在。当我们检查一系列字符串而不是遍历目录时,必须假设这些文件不需要存在于运行此脚本的计算机上。如果在顶部代码段的每个示例旁边,您能准确地显示将返回的文本,那就太好了。我不知道.csr文件名的示例,但是我知道有一个文件存在:
$csr=Get ChildItem-Path“$($domain.FullName)/*.csr”
然后
写主机“fileName:$($csr.Basename)”
@Leonardo
Get Item
要求该文件存在,否则它会抛出一个错误为什么这么难?如果文件名包含多个句点,则不起作用,例如,MyApp.exe.config这在powershell 6中是正确的。bog标准5.1中没有LeafBase的信息,我已经相应地更新了anwer。什么是bog?抱歉:)在我来自(英国)的地方,“bog标准”是一个俚语,指的是完全普通的“普通”版本。好的,但问题是关于文件名(字符串),而不是实际文件。这个方法名有误导性。。。它似乎获取的文件名没有扩展名或文件路径。如果它是您想要的,那么它很有用,但是如果您只想删除扩展,那么它就是一个交易破坏者。。。这些天来,在PowerShell v7上,我只需使用
分割路径C:\temp\myfile.txt-LeafBase
@KeithHill谢谢-LeafBase是在powershell v6中为其他人引入的curious@TylerH我不觉得这个方法名有误导性。相反,我发现它与[io.path]:GetFileName非常一致。我想说的是,GetFileName的意图非常明确,GetFileNameWithoutExtension应该做同样的事情——没有扩展名。
split-path c:\temp\myfile.txt -leafBase
Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf
(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.') | Select -First 1
(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.')[0]
$FileName = Split-Path "C:\Folder\SubFolder\myfile.txt.config.txt" -Leaf
$Extension = $FileName.Split('.') | Select -Last 1
$FileNameWoExt = $FileName.Substring(0, $FileName.Length - $Extension.Length - 1)
$allfiles=Get-ChildItem -Path C:\temp\*" -Include *.txt
foreach ($file in $allfiles) {
    Write-Host $file
    Write-Host $file.name
    Write-Host $file.basename
}