PowerShell 파일 이름에서 경로 및 확장자를 제거하는 중
파일에 대한 전체 경로인 문자열이 있습니다.파일 확장자 및 선행 경로 없이 파일 이름만 저장하려고 합니다.여기서부터:
c:\temp\myfile.txt
로.
myfile
실제로 디렉토리를 통해 반복하는 것이 아닙니다.이 경우 PowerShell의basename
부동산이 사용될 수도 있지만, 오히려 저 혼자만 상대하고 있어요.
전체 경로, 디렉토리, 파일 이름 또는 파일 확장자를 표시하는 문제는 생각보다 쉽게 해결할 수 있습니다.
## Output:
$PSCommandPath ## C:\Users\user\Documents\code\ps\test.ps1
(Get-Item $PSCommandPath ).Extension ## .ps1
(Get-Item $PSCommandPath ).Basename ## test
(Get-Item $PSCommandPath ).Name ## test.ps1
(Get-Item $PSCommandPath ).DirectoryName ## C:\Users\user\Documents\code\ps
(Get-Item $PSCommandPath ).FullName ## C:\Users\user\Documents\code\ps\test.ps1
$ConfigINI = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".ini"
$ConfigINI ## C:\Users\user\Documents\code\ps\test.ini
기타 양식:
$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)
핸디캡이 있어요.이를 위한 NET 방법:
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
@walid2mi의 답변에서 영감을 얻음:
(Get-Item 'c:\temp\myfile.txt').Basename
주의: 이것은 지정된 파일이 실제로 존재하는 경우에만 작동합니다.
또는
([io.fileinfo]"c:\temp\myfile.txt").basename
또는
"c:\temp\myfile.txt".split('\.')[-2]
기본 이름 속성을 사용할 수 있습니다.
PS II> ls *.ps1 | select basename
PowerShell 6부터는 다음과 같은 확장자를 사용하지 않고 파일 이름을 사용할 수 있습니다.
split-path c:\temp\myfile.txt -leafBase
다른 옵션은 다음과 같습니다.
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]
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.Path 개체는 다음과 같은 결과를 제공합니다.
strTestPath = C:\Users\DAG\문서\기사_2018\NTFS_File_Times_in_CMD\PathStringInfo.ps1Get DirectoryName = C:\Users\DAG\문서\기사_2018\NTFS_File_Times_in_CMDGetFileName = PathStringInfo.ps1GetExtension = .ps1GetFileNameWithoutExtension = 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이 Windows NT 명령어 스크립트 언어인 C#, C, C++와 어떻게 다른지, 그리고 제가 경험한 다른 모든 것에 대해 몇 가지 이상한 점이 발견되었습니다.
여기 괄호 없는 것이 있습니다.
[io.fileinfo] 'c:\temp\myfile.txt' | % basename
이 스크립트는 폴더 및 하위 폴더를 검색하고 확장자를 제거하여 파일 이름을 변경합니다.
Get-ChildItem -Path "C:/" -Recurse -Filter *.wctc |
Foreach-Object {
rename-item $_.fullname -newname $_.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
다음 명령어는 확장자 ".txt"와 일치하는 폴더의 모든 파일을 변수에 저장합니다.
$allfiles=Get-ChildItem -Path C:\temp\*" -Include *.txt
foreach ($file in $allfiles) {
Write-Host $file
Write-Host $file.name
Write-Host $file.basename
}
$file
c:\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\
$file.name
myfile.
$file.basename
는 파일 이름합니다.myfile file 、 myfile 、 myfile 、 myfile 、 myfile 。
다음은 PowerShell 5.1의 원라이너 옵션 중 하나로 패스를 시작하는 몇 가지 예입니다.
'c:\temp\myfile.txt' |%{[io.fileinfo]$_ |% basename}
또는
"c:\temp\myfile.txt" | Split-Path -Leaf | %{$_ -replace '\.\w+$'}
언급URL : https://stackoverflow.com/questions/12503871/removing-path-and-extension-from-filename-in-powershell
'it-source' 카테고리의 다른 글
같은 테이블의 한 열에서 다른 열로 데이터를 복사하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
---|---|
슬래시를 포함하는 변수를 sed에 전달하는 방법 (0) | 2023.04.11 |
Git 푸시에는 사용자 이름과 비밀번호가 필요합니다. (0) | 2023.04.11 |
WPF WPF에서 SVG 파일을 아이콘으로 사용하는 올바른 방법은 무엇입니까? (0) | 2023.04.11 |
프로시저에서 제공되지 않은 매개 변수를 예상합니다. (0) | 2023.04.11 |