不同目录清单的Powershell代码

时间:2014-06-13 18:18:32

标签: sql powershell

我有一个包含以下列表的文件:

tables\mytable1.sql
tables\myTable2.sql
procedures\myProc1.sql
functions\myFunction1.sql
functions\myFunction2.sql

从这些数据(并且总会有一个路径,它总是只有一个级别),我想要检索不同路径的列表(例如table \,procedures \,functions \)

为了使包含这些数据的文件已经被读入列表(名为$ fileList),所以新列表($ directoryList ??)很可能是从它派生的。

我找到了对-unique参数的引用,但是我需要从行的开头看,直到(包括)' \',其中只有是一次)。

2 个答案:

答案 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