【问题标题】:PowerShell--Finding any and all Subdirectories and Moving themPowerShell——查找所有子目录并移动它们
【发布时间】:2016-03-28 14:56:27
【问题描述】:

有人问过这个问题,但我发现的所有问题都没有完全回答我想要做的事情。我正在使用 PowerShell(对它来说是全新的)编写一个脚本,该脚本将搜索目录中的子目录,如果找到,则将其移动到指定目录。

我的问题在于以下代码:

$Folders = C:\Users\temp

$MoveFolders = Test-Path $Folders -PathType Container

Write-Host $MoveFolders 
#I'm writing this with ISE, so I'm using write-host to view output for testing.

我遇到的问题是,每次运行此代码时,它都会返回 true,即使临时目录中没有文件夹也是如此。我已经用我能想象到的所有可能的方式进行了尝试,并使用带有 where 对象的 get-childitem 进行了测试,但我只想在存在子目录的情况下执行移动。

其背后的想法是,如果用户以某种方式将文件或文件夹添加到该特定文件或文件夹,则在任务调度程序运行脚本时它将被移动。

编辑 重定向我的问题;它总是返回 true,并且有几个人指出我所写的将测试临时文件夹本身;那么有没有办法测试任何子文件夹并将其存储为布尔值,然后我可以将其传递给将完成移动过程的 if 语句?

【问题讨论】:

  • 您正在测试C:\Users\temp 目录的存在。试试Get-ChildItem C:\Users\temp\* | Where-Object {$_.PsIsContainer}
  • 是的,我认为我的问题本身并不彻底;您的建议可行,但我真正想做的是存储一个布尔值并将其传递给 if 语句,该语句将进行更改。这可能吗?

标签: powershell


【解决方案1】:

我相信这就是你想要做的。

  #get the folders/subfolders from the directory
  $folders = Get-ChildItem C:\Users\temp -Recurse -Directory
    #loop through the folders
    foreach($folder in $folders) {    
        #copy the the folder(s) and item(s) within to the destination   
        Copy-Item -Path $folder.FullName -Destination C:\test -Recurse
    }

这是您编辑问题后的更新答案。

$items = Get-ChildItem -Path C:\Users\mkrouse\Desktop\test -Directory -Recurse
#if items is equal to null, then there are no subfolders so assign the boolean to true
if($items -eq $null) {
    [bool]$NoSubfolders = $true;
    } else {
    [bool] $NoSubfolders = $false;
    }        

【讨论】:

  • 我编辑了我的问题以澄清,因为我意识到它很模糊;我道歉。我真正想做的是测试子文件夹的存在,存储为布尔值并将该值用于进一步的 if 语句。
  • @user6111573 更接近你想要的?
  • 是的!谢谢!我对其进行了一些修改,我想我现在已经掌握了。还在测试它。事实证明,几乎没有办法使用测试路径来做我想做的事,我确实使用了你提供的东西。感激不尽!我结束了$MoveFolders = Get-ChildItem $Folders -recurse | Where {$_.PSIsContainer} if($MoveFolders -ne $Null) { code }
  • @user6111573 太好了!我很高兴你能够让它工作。 PowerShell 是我最喜欢的脚本语言之一,所以我很高兴你可以自学。如果您能选择我的答案作为正确答案,我们将不胜感激!
【解决方案2】:

您的代码测试“c:\users\temp”是否是一个文件夹 - 这总是正确的。您需要在“c:\users\temp”中查找文件夹。一种方法:

$Folders = "C:\temp"
$MoveFolders = Get-ChildItem -Path $folders -Directory
Write-Host $MoveFolders.Count 

$MoveFolders 现在包含“c:\users\temp”中所有文件夹的列表。现在您有了要移动的文件夹列表。

【讨论】:

  • 好的,我知道你要去哪里了;有没有办法可以从这个测试中返回一个布尔值?我想将 $MoveFolders 传递给 if 语句,如果值为 true,则该语句将继续移动文件夹。我可能过于复杂了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
相关资源
最近更新 更多