【问题标题】:Copy file conditionally from multiple folders to multiple folders有条件地将文件从多个文件夹复制到多个文件夹
【发布时间】:2016-07-13 19:45:05
【问题描述】:

我需要一个脚本,允许我将文件拖放到监视文件夹中的 4 个文件夹中的任何一个中,然后根据拖放的文件夹将该文件复制到两个文件夹中。

观看的文件夹:C:\Users\Username\Desktop\PS DROP 文件夹

C:\Users\用户名\桌面\PS DROP FOLDERS\18x23
复制到 C:\Users\Username\Desktop\IJET RIP FOLDERS\LARGE 18x23
复制到 C:\Users\Username\Desktop\STE RIP - HR FOLDERS\LARGE 16x20-18x23

C:\Users\用户名\桌面\PS DROP FOLDERS\LARGE
复制到 C:\Users\Username\Desktop\IJET RIP FOLDERS\LARGE 16x20
复制到 C:\Users\Username\Desktop\STE RIP - HR FOLDERS\LARGE 16x20-18x23

C:\Users\Username\Desktop\PS DROP FOLDERS\MANUAL
复制到 C:\Users\Username\Desktop\IJET RIP FOLDERS\MANUAL 15x15
复制到 C:\Users\Username\Desktop\STE RIP - HR FOLDERS\MANUAL 15x15

C:\Users\用户名\桌面\PS DROP FOLDERS\SMALL
复制到 C:\Users\Username\Desktop\IJET RIP FOLDERS\SMALL 16x20
复制到 C:\Users\Username\Desktop\STE RIP - HR FOLDERS\SMALL 16x20

以下是我目前用于监视文件夹部分的代码(取自另一个 Q/A),但我无法弄清楚有条件地复制到多个文件夹的逻辑。似乎有比 IF 语句更好的方法。

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Users\Username\Desktop\PS DROP FOLDERS"
$watcher.Filter = "*.ps"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER A EVENT IS DETECTED
$action = {

HELP INQUIRY CODE HERE

}
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY  
$created = Register-ObjectEvent $watcher "Created" -Action $action
### $changed = Register-ObjectEvent $watcher "Changed" -Action $action
### $deleted = Register-ObjectEvent $watcher "Deleted" -Action $action
### $renamed = Register-ObjectEvent $watcher "Renamed" -Action $action
while ($true) {sleep 5}

抱歉,缺乏技巧。我不指望一个解决方案,但一些指导会很好。谢谢。

附:这是为了将文件路由到两个不同成像系统的 RIP 程序的热文件夹。

【问题讨论】:

  • 这看起来是一个不错的起始模板,到目前为止您尝试过什么?
  • 我建议运行Get-Help about_Switch 并使用Switch 命令来定义案例和操作。然后对于情况可能类似于{(split-path $_.directory -leaf) -eq '18x23'}{$_|Copy-Item 'C:\PathA';$_|Copy-Item 'C:\PathB'}
  • 谢谢!你真的为我指明了正确的方向。工作代码如下。

标签: .net powershell


【解决方案1】:

感谢 TheMadTechnician,我想出了一个使用 switch 命令的解决方案。希望这对其他人也有帮助。

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "C:\Users\Username\Desktop\PS DROP FOLDERS"
    $watcher.Filter = "*.ps"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER A EVENT IS DETECTED
       $action = { 
                   #GET NAME OF PARENT DIRECTORY FOR SWITCH AND OUTPUT VALUES IN CONSOLE
                   $item = $Event.SourceEventArgs.FullPath
                   $path = Split-Path (Split-Path $item -Parent) -leaf
                   Write-Host "item : " $item
                   Write-Host "path : " $path

      switch ($path)
    { 
        "LARGE" {
                   $destination = @("C:\Users\Username\Desktop\IJET RIP FOLDERS\LARGE 16x20","C:\Users\Username\Desktop\STE RIP - HR FOLDERS\LARGE 16x20-18x23")

                   foreach ($dir in $destination)
                   {
                   Copy-Item -Path $item -Destination $dir
                   }
                } 
        "SMALL" {
                   $destination = @("C:\Users\Username\Desktop\IJET RIP FOLDERS\SMALL 16x20","C:\Users\Username\Desktop\STE RIP - HR FOLDERS\SMALL 16x20")

                   foreach ($dir in $destination)
                   {
                   Copy-Item -Path $item -Destination $dir
                   }
                }
        "MANUAL" {
                   $destination = @("C:\Users\Username\Desktop\IJET RIP FOLDERS\MANUAL 15x15","C:\Users\Username\Desktop\STE RIP - HR FOLDERS\MANUAL 15x15")

                   foreach ($dir in $destination)
                   {
                   Copy-Item -Path $item -Destination $dir
                   }
                }
        "18x23" {
                   $destination = @("C:\Users\Username\Desktop\IJET RIP FOLDERS\LARGE 18x23","C:\Users\Username\Desktop\STE RIP - HR FOLDERS\LARGE 16x20-18x23")

                   foreach ($dir in $destination)
                   {
                   Copy-Item -Path $item -Destination $dir
                 }
              }
            }
          }
### DECIDE WHICH EVENTS SHOULD BE WATCHED + SET CHECK FREQUENCY  
    $created = Register-ObjectEvent $watcher "Created" -Action $action
### $changed = Register-ObjectEvent $watcher "Changed" -Action $action
### $deleted = Register-ObjectEvent $watcher "Deleted" -Action $action
### $renamed = Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 5}

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多