【问题标题】:How to make a code block finish completely before next command runs - Powershell V5如何在下一个命令运行之前使代码块完全完成 - Powershell V5
【发布时间】:2018-01-11 08:04:05
【问题描述】:

我发现一些帖子推荐使用 Start-Process -Wait 或将 .EXE 传送到 Out-Null,这对于 .EXE 文件非常有效,但我有一个包含内置 PowerShell cmdlet 的 foreach 循环。在下一行代码开始执行之前,如何确保循环首先完成?

作为参考,我正在使用一个名为 rclone 的工具将文件/文件夹复制到我们的团队驱动器中,但它目前不支持复制空目录。解决方法是在所有空目录中创建一个临时文件,运行该工具的同步命令,运行另一个 powershell 命令以从本地目录中删除临时文件,然后重新运行该工具的同步命令以将其从团队驱动器中删除。代码参考如下:

$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 还是应用程序的问题。

【问题讨论】:

    标签: powershell powershell-5.0


    【解决方案1】:

    将应用程序作为普通的 PowerShell 命令运行对您来说应该可以正常工作,除非应用程序执行异常操作:

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

    如果您需要应用程序的完整路径并且路径中有空格,则使用调用特殊字符:

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

    这将使 PowerShell 等待应用程序的执行,就像它等待任何本机 PowerShell 命令一样。如果需要,您可以重定向输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 2018-05-20
      • 2020-08-08
      • 2019-12-31
      • 2023-03-06
      • 1970-01-01
      • 2018-04-03
      • 2017-12-21
      相关资源
      最近更新 更多