我有这个脚本:
$appArray | foreach {
$o = $_;
Get-ChildItem .\app\$o\partials -Recurse |
ForEach-Object {
$i = $_;
Write-Host "app/$o/partials/$i";
Write-S3Object `
-BucketName "staging" `
-Key "app/$o/partials/$i" `
-File "app/$o/partials/$i" `
-HeaderCollection @{"Cache-Control" = "public,max-age=3600"}
}
}
该脚本位于app
目录下面的目录中,所以我希望在Get-ChildItem
上升到一个目录时我希望" app /..."从一个目录开始。
我应该使用/
还是\
,如何在此目录中使用此命令?
答案 0 :(得分:3)
我使用/
。但要获取父目录,您应该考虑使用GetParent:
[System.IO.Directory]::GetParent('YOUR_PATH')
或Split-Path cmdlet:
Get-Item 'YOUR_PATH' | Split-Path -parent
或访问该属性:
(Get-Item 'YOUR_PATH').parent.fullname
这里是您采用的代码。注意:我还使用Join-Path cmdlet组合路径并确定第一行中的脚本目录(否则,只有当前位置是脚本目录时,您的脚本才会起作用):
$scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$scriptParentPath = $scriptPath | Split-Path -Parent
$appArray | foreach {
$o = $_;
$currentPath = Join-Path (Join-Path $scriptParentPath $o) 'partials'
Get-ChildItem $currentPath -Recurse |
ForEach-Object {
...
}
}
答案 1 :(得分:1)
只是澄清一下,自2003年左右以来,/和\是有效的路径分隔符(即使在CMD.exe中)
是否有理由选择foreach-object
而非使用
foreach ($o in $appArray) {
foreach ($i in (Get-ChildItem .\app\$o\partials -Recurse)) {
<your code>
}
}
我问在pipline中你无法使用continue
,break
或&#39;退出&#39;因为即使在任何嵌套循环中它也会影响管道而不是循环。
最后,要回答上面的评论,您可以使用.
和..
但是您必须自己构建路径,而不是使用split-path -parent
和join-path
。如果您有路径或[System.IO.DirectoryInfo]或[System.IO.FileInfo](由Get-ChildItem
返回),为什么不简化您的代码并使用内置命令。
foreach ($folder in $appArray) {
foreach ($item in (Get-ChildItem .\app\$folder\partials -Recurse)) {
$itemPath = $item.Fullname -replace "$PWD\",""
Write-Host $itemPath
Write-S3Object `
-BucketName "staging" `
-Key $itemPath
-File $ItemPath
-HeaderCollection @{"Cache-Control" = "public,max-age=3600"}
}
}
答案 2 :(得分:1)
您应该始终使用/.
Linux工具有时需要它,当Linux上的Posh变为现实时,脚本最终将更具可移植性。