it-source

PowerShell 파일 이름에서 경로 및 확장자를 제거하는 중

criticalcode 2023. 4. 11. 22:06
반응형

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
}

$filec:\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\myfile\

$file.namemyfile.

$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

반응형