2017-07-28 2 views
0

Start-Process -Waitを使用するか、.EXEを.EXEファイルとしてうまく動作するOut-Nullにパイプすることで、いくつかの投稿を推薦しましたが、組み込みのPowerShellコマンドレット。次のコード行が実行される前に、ループが完全に完了したことを確認するにはどうすればよいですか?次のコマンドが実行される前にコードブロックを完全に終了する方法

参考までに、ファイル/フォルダをチームドライブにコピーするのにrcloneというツールを使用していますが、現在は空のディレクトリのコピーをサポートしていません。回避策は、すべての空のディレクトリに一時ファイルを作成し、ツールのsyncコマンドを実行し、別のpowershellコマンドを実行してローカルディレクトリから一時ファイルを削除してから、ツールのsyncコマンドを再実行してチームドライブから削除します。以下のコードの参照:

$shares = "Office Operations","Training" 

# iterate through each share and output full path name to empty shares 
$emptyDirs = foreach ($share in $shares) { 
    Get-ChildItem -Path "\\servername\e`$\rootshare\$share" -Recurse -Directory | Where-Object {$_.GetFileSystemInfos().Count -eq 0} | select FullName 
} 

# iterate through each empty directory and create a temp.txt file with a random string 
$emptyDirs | % {new-item $_.FullName -ItemType file -name temp.xyz -value "This is a test string"} 

# initial rclone sync to copy over directory with temp.txt file 
foreach ($share in $shares) { 
    Start-Process "C:\program files\rclone\rclone.exe" -ArgumentList "sync `"\\servername\e`$\rootshare\$share`" `"$($share + ':')`"" -Wait -NoNewWindow 
} 

# iterate through each empty folder, cd accordingly and delete all .txt files 
$emptyDirs | % { 
    Set-Location $_.FullName 
    Remove-Item * -Include *.xyz 
} 

# second rclone sync to remove temp.txt file while maintaining folder structure 
foreach ($share in $shares) { 
    Start-Process "C:\program files\rclone\rclone.exe" -ArgumentList "sync `"\\servername\e`$\rootshare\$share`" `"$($share + ':')`"" -Wait -NoNewWindow 
} 

コードは動作しますが、私は手動でそれ以外の場合は、いくつかのtemp.xyzファイルはチーム・ドライブから削除されていない第二の同期コマンドを実行する必要があります。それは、ローカルシェアから削除されているので、うまくいくようです。これがPowerShellまたはアプリケーションの問題であるかどうかは不明です。アプリケーションは珍しい何かをしない限り、

答えて

0

通常のPowerShellコマンドとしてアプリケーションを実行すると、あなたのためにうまく動作するはずです:

rclone.exe sync "\\servername\e`$\rootshare\$share" "$($share + ':')" 

アプリケーションへの完全なパスを必要とし、それがパスにスペースが含まれている場合は、その後、呼び出しの特殊文字を使用します。

& "C:\program files\rclone\rclone.exe" sync "\\servername\e`$\rootshare\$share" "$($share + ':')" 

をこれは、PowerShellはちょうどそれが任意のネイティブPowerShellコマンドの場合と同様に、アプリケーションの実行を待つようになります。必要に応じて出力をリダイレクトすることができます。

関連する問題