programing

경로가 PowerShell의 폴더 또는 파일인지 확인

megabox 2023. 9. 11. 21:34
반응형

경로가 PowerShell의 폴더 또는 파일인지 확인

저는 폴더 또는 파일 경로인 값 목록을 거친 PowerShell 스크립트를 작성하고 파일을 먼저 삭제한 후 빈 폴더를 제거하려고 합니다.

지금까지 내 대본:

[xml]$XmlDocument = Get-Content -Path h:\List_Files.resp.xml
$Files =  XmlDocument.OUTPUT.databrowse_BrowseResponse.browseResult.dataResultSet.Path

이제 변수의 각 줄을 테스트하여 파일인지 먼저 삭제한 다음 하위 폴더와 폴더를 살펴보고 제거하려고 합니다.이것은 단지 그것이 깨끗한 과정이기 때문입니다.

다음 단계는 잘 모르겠지만, 다음과 같은 것이 필요할 것 같습니다.

foreach ($file in $Files)
{
    if (! $_.PSIsContainer)
    {
        Remove-Item $_.FullName}
    }
}

다음 섹션에서는 하위 폴더와 폴더를 정리할 수 있습니다.

좋은 의견이라도 있나?

다음 질문에 대한 해결 방법을 찾았습니다.Test-Path매개 변수가 있는 cmdlet-PathType와 대등한Leaf파일인지 또는 파일인지 확인하기 위해Container폴더인지 확인하기 위해:

# Check if file (works with files with and without extension)
Test-Path -Path 'C:\Demo\FileWithExtension.txt' -PathType Leaf
Test-Path -Path 'C:\Demo\FileWithoutExtension' -PathType Leaf
 
# Check if folder
Test-Path -Path 'C:\Demo' -PathType Container

Demo

저는 원래 여기서 해결책을 찾았습니다.그리고 공식적인 언급은 여기 있습니다.

제 생각엔 당신의$Filesobject는 문자열의 배열입니다.

PS D:\PShell> $Files | ForEach-Object {"{0} {1}" -f $_.Gettype(), $_}
System.String D:\PShell\SO
System.String D:\PShell\SU
System.String D:\PShell\test with spaces
System.String D:\PShell\tests
System.String D:\PShell\addF7.ps1
System.String D:\PShell\cliparser.ps1

아쉽게도.PSIsContainer속성은 문자열 개체에서 찾을 수 없지만 파일 시스템 개체에서는 찾을 수 없습니다.

PS D:\PShell> Get-ChildItem | ForEach-Object {"{0} {1}" -f $_.Gettype(), $_}
System.IO.DirectoryInfo SO
System.IO.DirectoryInfo SU
System.IO.DirectoryInfo test with spaces
System.IO.DirectoryInfo tests
System.IO.FileInfo addF7.ps1
System.IO.FileInfo cliparser.ps1

문자열에서 파일 시스템 개체를 가져오려면:

PS D:\PShell> $Files | ForEach-Object {"{0} {1}" -f (Get-Item $_).Gettype(), $_}
System.IO.DirectoryInfo D:\PShell\SO
System.IO.DirectoryInfo D:\PShell\SU
System.IO.DirectoryInfo D:\PShell\test with spaces
System.IO.DirectoryInfo D:\PShell\tests
System.IO.FileInfo D:\PShell\addF7.ps1
System.IO.FileInfo D:\PShell\cliparser.ps1

다음 코드 조각 시도:

$Files | ForEach-Object 
  {
    $file = Get-Item $_               ### string to a filesystem object
    if ( -not $file.PSIsContainer)
        {
            Remove-Item $file}
        }
  }

사용할 수 있습니다.get-item경로를 명령하고 공급합니다.그러면 확인할 수 있습니다.PSIsContainer제공된 경로가 폴더를 대상으로 하는지 파일을 대상으로 하는지 여부를 결정하는 속성.

$target = get-item "C:\somefolder" # or "C:\somefolder\somefile.txt"
if($target.PSIsContainer) {
# it's a folder
}
else { #its a file }

이것이 미래의 방문객들에게 도움이 되기를 바랍니다.

다음 코드를 생각해 보십시오.

$Files = Get-ChildItem -Path $env:Temp

foreach ($file in $Files)
{
    $_.FullName
}

$Files | ForEach {
    $_.FullName
}

첫 번째 foreach는 looping을 위한 PowerShell 언어 명령이고, 두 번째 Foreach는 에일리어스입니다.ForEach-Object완전히 다른 것인 cmdlet.

에서ForEach-Object,그$_루프의 현재 객체를 가리킵니다.$Files수집품들이 있습니다만, 각각의 첫번째 것에서,$_의미가 없습니다.

앞에서 각 루프는 루프 변수를 사용합니다.$file:

foreach ($file in $Files)
{
    $file.FullName
}

또 다른 방법은 를 사용하는 것입니다.

파일 이름의 MWE:

$(Get-Item c:\windows\system32) -is [System.IO.DirectoryInfo]

언급URL : https://stackoverflow.com/questions/39825440/check-if-a-path-is-a-folder-or-a-file-in-powershell

반응형