ファイルへのフルパスである一連の文字列があります。ファイル拡張子と先頭パスを除いて、ファイル名だけを保存したいのですが。だからこれから:
c:\temp\myfile.txt
に
myfile
私は実際にはディレクトリを反復処理していません。その場合、Powershellのbasename
プロパティのようなものを使用できますが、文字列だけを処理しています。
ファイルへのフルパスである一連の文字列があります。ファイル拡張子と先頭パスを除いて、ファイル名だけを保存したいのですが。だからこれから:
c:\temp\myfile.txt
に
myfile
私は実際にはディレクトリを反復処理していません。その場合、Powershellの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)
$csr = Get-ChildItem -Path "$($domain.FullName)/*.csr"
、その後Write-Host "fileName: $($csr.Basename)"
または
([io.fileinfo]"c:\temp\myfile.txt").basename
または
"c:\temp\myfile.txt".split('\.')[-2]
basenameプロパティを使用できます
PS II> ls *.ps1 | select basename
任意のパス文字列が与えられると、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
以下は、上記の出力を生成したコードです。
[console]::Writeline( "strTestPath = {0}{1}" ,
$strTestPath , [Environment]::NewLine );
[console]::Writeline( "GetDirectoryName = {0}" ,
[IO.Path]::GetDirectoryName( $strTestPath ) );
[console]::Writeline( "GetFileName = {0}" ,
[IO.Path]::GetFileName( $strTestPath ) );
[console]::Writeline( "GetExtension = {0}" ,
[IO.Path]::GetExtension( $strTestPath ) );
[console]::Writeline( "GetFileNameWithoutExtension = {0}" ,
[IO.Path]::GetFileNameWithoutExtension( $strTestPath ) );
上記を生成したスクリプトを作成してテストすると、PowerShellがC#、C、C ++、Windows NTコマンドスクリプト言語とどのように異なるか、そして私が経験した他のすべてのものについて、いくつかの癖が明らかになりました。
PowerShell 6以降では、次のように拡張子なしのファイル名を取得します。
split-path c:\temp\myfile.txt -leafBase
このスクリプトは、フォルダーとサブフォルダーを検索し、拡張子を削除してファイルの名前を変更します
Get-ChildItem -Path "C:/" -Recurse -Filter *.wctc |
Foreach-Object {
rename-item $_.fullname -newname $_.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
または
(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.')[0]
これは「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」を返します。ここでは、Replace()ではなくSubstring()を使用することをお勧めします。これは、私の例のように、ピリオドが前に付いた拡張子も名前の一部になる可能性があるためです。Substringを使用することにより、要求に応じて拡張子なしのファイル名を返します。
カッコのないものはこちら
[io.fileinfo] 'c:\temp\myfile.txt' | % basename
これは、文字列を数回分割することで実行できます。
#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