2016-04-13 6 views
2

私はこのスクリプトを持っている:ディレクトリ文字列に/またはを使用すべきですか?

$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"} 
     } 
} 

スクリプトは1つ上のディレクトリに行くためにGet-ChildItemを行うときに、私は希望appディレクトリ以下のディレクトリにあると私はオフを開始するには、「アプリ/ ...」をしたいと思います1つのディレクトリを上に移動します。

/または\を使用する必要があります。このコマンドのディレクトリを1つ上げるにはどうすればよいですか。

+0

@AnsgarWiechers - それを修正しました。ありがとう、私は間違ってgulpファイルの問題に取り組んでいたので、追加しました。 – Alan2

答えて

3

私は/を使用します。しかし、親ディレクトリを取得するには、GetParentを使用して検討する必要があります。

[System.IO.Directory]::GetParent('YOUR_PATH') 

またはSplit-Pathレット:

Get-Item 'YOUR_PATH' | Split-Path -parent 

またはプロパティにアクセス:

(Get-Item 'YOUR_PATH').parent.fullname 

そして、あなたの採用コードをここに。注:Imはまた、(あなたの現在の場所は、スクリプトのディレクトリであればそうでない場合は、スクリプトのみ動作します)のパスを組み合わせて、最初の行のスクリプトディレクトリを決定するためにJoin-Pathコマンドレットを使用して:

$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 { 
      ... 
     } 
} 
+0

質問にあるコードにこれをどのように適用するかの例を挙げることができますか?私はちょうど使用することはできません。または..上のディレクトリに移動するには? – Alan2

+0

私の答えが更新されました。 '..'を使ってディレクトリを上げることができます。しかし、私は上記の機能を使う方が好きです。 –

+1

より良い方法では、 '[DirectoryInfo]'または '' Get-ChildItem'から返された[[FileInfo] 'は、そのオブジェクトの' Directory'プロパティを使うことになります。このプロパティは、すでに '-is [System.IO.DirectoryInfo]' – Djarid

1

だけ明確にする、以来、 2003年の両方の周りに/と\は

(でもCMD.EXEで)有効なパス区切り文字は、使用することはできませんforeach-objectへの配管の理由ではなく、私がpipline内にあると聞いて

foreach ($o in $appArray) { 
    foreach ($i in (Get-ChildItem .\app\$o\partials -Recurse)) { 
     <your code> 
    } 
} 

を使用するよりもありますcontinuebreakまたは 'exit'は、ループがネストされていないループでもパイプラインに影響します。

そして最後に、上記のあなたのコメントに答えるために、あなたは...を使用することができますが、あなたはかなりsplit-path -parentjoin-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"} 
    } 
} 
+1

の親であり、 'continue'ではなく'% 'パイプラインで' return'を使用します。あなたは「壊れる」ことはできません。 – majkinetor

1

必ず/を使用してください。

Linuxツールではそれが必要になることがあり、Linux上のPoshが現実になるとスクリプトは最終的に移植性が向上します。