我有一个包含以下列表的文件:
tables\mytable1.sql
tables\myTable2.sql
procedures\myProc1.sql
functions\myFunction1.sql
functions\myFunction2.sql
从这些数据(并且总会有一个路径,它总是只有一个级别),我想要检索不同路径的列表(例如table \,procedures \,functions \)
为了使包含这些数据的文件已经被读入列表(名为$ fileList),所以新列表($ directoryList ??)很可能是从它派生的。
我找到了对-unique参数的引用,但是我需要从行的开头看,直到(包括)' \',其中只有是一次)。
答案 0 :(得分:0)
假设您已拥有$fileList
的数据,请尝试以下操作:
$directoryList = $fileList | %{ $_.split("\")[0]} | select -unique
它将对列表中的元素执行foreach(%{}
),然后通过\
拆分它们,并仅获取第一部分(在您的情况下,文件夹名称)之后,您使用select -unique
来获取不同的值。
或者,你可以这样做:
$fileList | %{ $_ -replace "\\.*$","" } | select -unique
使用-replace
删除\
之后的所有内容。
另外,如果由于某种原因你已经没有$fileList
上的文本文件的值,你可以使用:
$fileList = Get-Content yourFile.txt
答案 1 :(得分:0)
您的文件可能包含空行,而且最后一行通常会有一个空行,因此这将说明这一点。
它还有一个稍微不同的正则表达式来匹配不是 \
字符的字符串的末尾,这适用于包括您的示例在内的多个级别的路径。
如果您有一个包含以下内容的文本文件:
Z:\Path to somewhere\Files\some file 1.txt
Z:\Path to somewhere\Files\some file 2.txt
tables\mytable1.sql
tables\myTable2.sql
procedures\myProc1.sql
functions\myFunction1.sql
functions\myFunction2.sql
使用此代码也显示函数后的输出:
$fileListToProcess = "$([Environment]::GetFolderPath(""Desktop""))\list.txt"
Function Get-UniqueDirectoriesFromFile {
Param
(
[Parameter(Mandatory = $true, HelpMessage = 'The file where the list of files is.')]
[string]$LiteralPath
)
if (Test-Path -LiteralPath $LiteralPath -PathType Leaf) {
$fileList = [IO.File]::ReadAllLines($LiteralPath)
return $fileList | %{ $_ -replace '\\[^\\]*$', '' } | ? { $_.trim() -ne "" } | Select -Unique
}
else {
return $null
}
}
$uniqueDirs = Get-UniqueDirectoriesFromFile -file $fileListToProcess
# Display the results:
$uniqueDirs
# PS>
# Z:\Path to somewhere\Files
# tables
# procedures
# functions
$uniqueDirs.count
# PS> 4