我并不是100%肯定如何制定这个PowerShell。
如果我的PWD是" C:\ Work \ Projects \ Release \ 20140610"并且它本身就是一个由几个子文件夹组成的目录树,这些子文件夹本身可能包含文件和子文件夹,但是我如何格式化输出以使其打印如下:
20140610\HTML\File1.html
20140610\HTML\File2.html
20140610\HTML\File3.html
20140610\HTML\Forms\Form1.html
20140610\HTML\Forms\Form2.html
20140610\HTML\Forms\Form3.html
20140610\HTML\Views\View1.html
20140610\Scripts\File1.js
编辑:
抱歉,发布得太早。
到目前为止我所拥有的是:
$TableFormat = @{Expression={ $_.Path};Label="Name"},@{Expression = {$_.HashString};Label="Signature"}
Get-ChildItem -Recurse | ?{ !$_.PSIsContainer } | Get-Hash -Algorithm MD5 | Format-Table -AutoSize $TableFomat | Tee-Object -FilePath "C:\Signatures.txt"
现在,我相信我需要添加路径拆分,并且可能在文件夹检查后加入到中游。但是,如此,我没有得到全名,所以我不确定 如何继续。
答案 0 :(得分:3)
目前尚不清楚您所发布的代码中使用的格式与问题的关系如何,因为它似乎与您上面列出的格式相矛盾,除非您的意思是希望是输出中的一列。
在任何情况下,如果您需要的是目录 C:\ Work \ Projects \ Release \ 20140610 的子树中的所有文件的列表,其路径从该根目录开始排除了该根的父路径的子树,您可以使用 -replace 从每个文件的 FullName 属性中删除父路径(文件的完整路径):
$Path = 'C:\Work\Projects\Release\20140610'
Get-ChildItem $Path -Recurse | ?{! $_.PSIsContainer} `
| %{$_.FullName -replace [regex]::Escape("$(Split-Path $Path)\"), ''}
要将其用作名称列的值,只需使用 ForEach-Object (%)中的scriptblock作为表达式:
@{l='Name'; e={$_.FullName -replace [regex]::Escape("$(Split-Path $Path)\"), ''}}
"$(Split-Path $Path)\"
为您提供$ Path的父级加上一个尾部反斜杠,它是您要排除的路径的一部分(通过将其替换为空字符串)。您可能希望将此值分配给变量以提高效率(以避免在管道的每次迭代时重新计算它),但似乎没有太大的开销。[regex]::Escape
转义任何正则表达式特殊字符,这对于包含反斜杠的Windows路径尤为重要。-File
代替| ?{! $_.PSIsContainer}
答案 1 :(得分:3)
你的意思是你只想要相对路径,包括当前目录而不是完整路径?这样的事情应该这样做:
$cwd = (Get-Item .).Parent.FullName
$re = '^' + [regex]::Escape("$cwd\")
Get-ChildItem -Recurse |
Where-Object { -not $_.PSIsContainer } |
ForEach-Object { $_.FullName -replace $re }