2017-07-28 76 views
0

我发现一些帖子建议使用Start-Process -Wait或管道.EXE到Out-Null,这适用于.EXE文件,但我有一个foreach循环,其中包含内置PowerShell cmdlet。在下一行代码开始执行之前,我该如何确保循环完成?如何在下一个命令运行之前完成一个代码块完成 - Powershell V5

作为参考,我正在使用一种名为rclone的工具将文件/文件夹复制到我们的团队驱动器中,但它目前不支持复制空目录。解决方法是在所有空目录中创建一个临时文件,运行该工具的同步命令,运行另一个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 
} 

代码的工作,但我必须手动运行2同步命令,否则一些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命令。如果需要,您可以重定向输出。

相关问题