파일에 대한 전체 경로 인 일련의 문자열이 있습니다. 파일 확장자와 선행 경로없이 파일 이름 만 저장하고 싶습니다. 그래서 이것으로부터 :
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"
thenWrite-Host "fileName: $($csr.Basename)"
@ walid2mi 의 답변 에서 영감을 얻었 습니다.
(Get-Item 'c:\temp\myfile.txt').Basename
참고 : 이것은 주어진 파일이 실제로 존재하는 경우에만 작동 합니다 .
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을 사용하여 요청 된 확장자없이 파일 이름을 반환합니다.
이것은 문자열을 몇 번 분할하여 수행 할 수 있습니다.
#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