我发现有一些帖子建议使用Start-Process -Wait
或将.EXE传递给Out-Null
,这适用于.EXE文件,但我有一个包含内置PowerShell cmdlet的foreach循环。在下一行代码开始执行之前,如何确保循环完全完成?
作为参考,我使用一个名为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 :(得分:0)
将应用程序作为普通PowerShell命令运行应该可以正常工作,除非应用程序执行异常操作:
rclone.exe sync "\\servername\e`$\rootshare\$share" "$($share + ':')"
如果您需要应用程序的完整路径并且路径中有空格,则使用调用特殊字符:
& "C:\program files\rclone\rclone.exe" sync "\\servername\e`$\rootshare\$share" "$($share + ':')"
这将使PowerShell等待应用程序的执行,就像对任何本机PowerShell命令一样。如果需要,您可以重定向输出。