경로가 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
저는 원래 여기서 해결책을 찾았습니다.그리고 공식적인 언급은 여기 있습니다.
제 생각엔 당신의$Files
object는 문자열의 배열입니다.
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
'programing' 카테고리의 다른 글
역할 구독자를 가진 사용자를 가져오기 위한 SQL 쿼리 (0) | 2023.09.11 |
---|---|
명령 프롬프트에서 PowerShell 명령 실행(ps1 스크립트 없음) (0) | 2023.09.11 |
C와 C++의 Float와 Double의 크기는 어떻게 됩니까? (0) | 2023.09.11 |
구조 객체가 없는 C 포인터 산술 (0) | 2023.09.11 |
데이터 프레임의 두 열을 명명된 벡터로 변환 (0) | 2023.09.11 |