Powershell 获取文件夹名称之类的,并获取第一个子目录
Powershell getting foldername like, and get the first subdirectory
我已经有了从所有子目录中获取文件的脚本
但是我无法控制获取子目录的深度。
我的意思是,我的路径中有多个子目录。例如。
C:\SCRIPTS\testing\testfiles\rawfiles rawfiles下有子目录
- stuck_test
- raw_testfiles1-->stuck_test
- raw_testfiles2-->stuck_test
- raw_testfiles3-->stuck_test
- raw_testfiels4-->stuck_test
而我想要做的是让 stuck_test 不在 raw_testfiles1 目录中。但我不想指定路径。就像我想限制-recurse。
提前致谢。
我真的被困在这里了。
cls
$folderName = "stuck_test"
$pathtest = "C:\SCRIPTS\testing\testfiles\rawfiles"
$gettest = Get-ChildItem -path $pathtest -filter $foldername -recurse| Select-Object -Expand FullName
$path1 = $gettest
$Allfiles = Get-Childitem -Path $path1 -recurse| Where {!$_.PSIsContainer}| Select-Object Fullname
foreach ($file in $Allfiles)
{
$file1 = $file.Fullname
$foldername = Get-ChildItem -Path $file.Fullname
$input = $foldername.Directoryname
$Mothername = Get-Item -Path $input
$output = $Mothername.Parent.Fullname
$output = "$output\processed"
Write-Host "The Filename: $file1"
Write-Host "The FolderName: $input"
$Getbase = (Get-Item $file1).BaseName
Write-Host $Getbase
"$file1" | Out-File -FilePath "C:\SCRIPTS\tester\LIST\stuck_files_list.txt" -Append
}
您可以在 where-object 调用中使用 -notlike
排除文件夹。
如果您只想排除 raw_testfile1 中的 stuck_test 文件夹:
Get-ChildItem D:\testfolder -Recurse -Directory -Filter "stuck_test" | Where-Object {$_.FullName -notlike *rawr_testfile1\stuck_test'}
在我的测试场景中,我只在 raw_testfile2
中获得了 stuck_test 文件夹
D:\testfolder\stuck_test
D:\testfolder\rawr_testfile2\stuck_test
编辑:再次阅读你的标题我可能误解了你想做的事情,如果你想让所有子文件夹达到一定深度你可以使用\*
在你的 Get-ChildItem 路径中
获取初始文件夹和 1 个子文件夹的所有文件夹
$myPaths = @()
$mypaths += Get-ChildItem D:\testfolder\*,D:\testfolder\*\* | Select -ExpandProperty FullName
然后我们的 $myPaths 变量看起来像这样
D:\testfolder\rawr_testfile1
D:\testfolder\rawr_testfile2
D:\testfolder\stuck_test
D:\testfolder\rawr_testfile1\stuck_test
D:\testfolder\rawr_testfile2\stuck_test
这是一个函数,可以满足您的需求:
Function GCI-ToDepth{
Param(
$Path = $PWD.Path,
$Filter = "*",
$Depth = 255
)
$Paths = 1..$Depth|ForEach{"{0}{1}" -f $Path.trimend('\'), ("\*" * $_)}
Get-ChildItem -Path $Paths -Filter $Filter
}
它基于您可以对未知文件夹使用带 * 的 Get-ChildItem 的原则,因此您可以执行 Get-ChildItem C:\SCRIPTS\testing\testfiles\rawfiles\*\
而这实际上与您想要为您提供所有文件中的文件相反这些子文件夹,但不是 rawfiles 文件夹本身。这个想法虽然扎实。根据您的需要,您可以 运行:
GCI-ToDepth -Path "C:\SCRIPTS\testing\" -Depth 3
这将为您提供指定文件夹中的文件,以及该文件夹的所有子文件夹及其子文件夹中的任何内容,但除此之外什么都没有。
我已经有了从所有子目录中获取文件的脚本 但是我无法控制获取子目录的深度。 我的意思是,我的路径中有多个子目录。例如。 C:\SCRIPTS\testing\testfiles\rawfiles rawfiles下有子目录
- stuck_test
- raw_testfiles1-->stuck_test
- raw_testfiles2-->stuck_test
- raw_testfiles3-->stuck_test
- raw_testfiels4-->stuck_test
而我想要做的是让 stuck_test 不在 raw_testfiles1 目录中。但我不想指定路径。就像我想限制-recurse。 提前致谢。 我真的被困在这里了。
cls
$folderName = "stuck_test"
$pathtest = "C:\SCRIPTS\testing\testfiles\rawfiles"
$gettest = Get-ChildItem -path $pathtest -filter $foldername -recurse| Select-Object -Expand FullName
$path1 = $gettest
$Allfiles = Get-Childitem -Path $path1 -recurse| Where {!$_.PSIsContainer}| Select-Object Fullname
foreach ($file in $Allfiles)
{
$file1 = $file.Fullname
$foldername = Get-ChildItem -Path $file.Fullname
$input = $foldername.Directoryname
$Mothername = Get-Item -Path $input
$output = $Mothername.Parent.Fullname
$output = "$output\processed"
Write-Host "The Filename: $file1"
Write-Host "The FolderName: $input"
$Getbase = (Get-Item $file1).BaseName
Write-Host $Getbase
"$file1" | Out-File -FilePath "C:\SCRIPTS\tester\LIST\stuck_files_list.txt" -Append
}
您可以在 where-object 调用中使用 -notlike
排除文件夹。
如果您只想排除 raw_testfile1 中的 stuck_test 文件夹:
Get-ChildItem D:\testfolder -Recurse -Directory -Filter "stuck_test" | Where-Object {$_.FullName -notlike *rawr_testfile1\stuck_test'}
在我的测试场景中,我只在 raw_testfile2
中获得了 stuck_test 文件夹D:\testfolder\stuck_test
D:\testfolder\rawr_testfile2\stuck_test
编辑:再次阅读你的标题我可能误解了你想做的事情,如果你想让所有子文件夹达到一定深度你可以使用\*
在你的 Get-ChildItem 路径中
获取初始文件夹和 1 个子文件夹的所有文件夹
$myPaths = @()
$mypaths += Get-ChildItem D:\testfolder\*,D:\testfolder\*\* | Select -ExpandProperty FullName
然后我们的 $myPaths 变量看起来像这样
D:\testfolder\rawr_testfile1
D:\testfolder\rawr_testfile2
D:\testfolder\stuck_test
D:\testfolder\rawr_testfile1\stuck_test
D:\testfolder\rawr_testfile2\stuck_test
这是一个函数,可以满足您的需求:
Function GCI-ToDepth{
Param(
$Path = $PWD.Path,
$Filter = "*",
$Depth = 255
)
$Paths = 1..$Depth|ForEach{"{0}{1}" -f $Path.trimend('\'), ("\*" * $_)}
Get-ChildItem -Path $Paths -Filter $Filter
}
它基于您可以对未知文件夹使用带 * 的 Get-ChildItem 的原则,因此您可以执行 Get-ChildItem C:\SCRIPTS\testing\testfiles\rawfiles\*\
而这实际上与您想要为您提供所有文件中的文件相反这些子文件夹,但不是 rawfiles 文件夹本身。这个想法虽然扎实。根据您的需要,您可以 运行:
GCI-ToDepth -Path "C:\SCRIPTS\testing\" -Depth 3
这将为您提供指定文件夹中的文件,以及该文件夹的所有子文件夹及其子文件夹中的任何内容,但除此之外什么都没有。