【问题标题】:Moving files that contain who's name that contains what work, SOW, to a target subdirectory将包含 who's name 的文件移动到目标子目录
【发布时间】:2014-12-18 18:06:34
【问题描述】:

所以我想将一个目录的所有子目录中包含“SOW”一词的所有文件移动到每个子目录的子目录中。示例:如果 sub2 中有一个名为 firstsow.txt 的文件,我想将其移动到 sub2/SOW。我设法通过命令“move SOW SOW”做到了这一点。这工作正常,但是当我尝试递归运行它时,不确定这是否是正确的术语,对于所有子目录(sub 1、sub 2 等),通过运行命令:

for /r %a in (example/*) do call sow.bat

这是我调用的 sow.bat 文件:

move *SOW* SOW

我收到一条消息,提示“无法将多个文件移动到一个文件中”。这条消息意味着我的脚本试图做什么?

【问题讨论】:

  • 我已经有一段时间没有进行任何批处理编程了,但我认为该错误意味着没有名为 SOW 的 DIRECTORY,因此假设您正在移动到名为 SOW 的 FILE。不允许您尝试这样做是足够聪明的,因为除了您尝试移动的文件之一之外,您会丢失所有内容。
  • 所有子目录还包含一个名为 SOW 的子目录,这可能是个问题吗?

标签: powershell batch-file for-loop move


【解决方案1】:

由于 PowerShell 被标记为此:

$path = "c:\temp"
$toMatch = "SOW"

$files = Get-ChildItem $path -Recurse -Filter "*$toMatch*" | Where-Object{!($_.PSIsContainer)} 
$files | ForEach-Object{
    # Found a file with $toMatch in the title 
    If(!(Test-Path "$($_.DirectoryName)\$toMatch")){[void](New-Item -ItemType Directory -Name $toMatch -Path $_.DirectoryName)}
    Move-Item $_.FullName -Destination "$($_.DirectoryName)\$toMatch"
}

查找标题中带有$toMatch 的所有文件,并将它们收集到$files。对于这些文件中的每一个,请查看同一目录中是否有名称为 $toMatch 的文件夹。如果不创建文件夹。然后将该文件移动到目录中。

使用少量文件进行测试,它似乎有效。

【讨论】:

  • 抱歉,我认为 powershell 是命令行的另一个名称。我刚刚得知我正在使用的计算机安装了powershell,但我还不知道如何使用它。
【解决方案2】:

这应该做你想做的:

for /R %a in (example\*SOW*) do move "%a" "%~Pa\SOW"

在命令行中执行上一个命令。如果要将其包含在批处理文件中,请将百分号加倍。

【讨论】:

  • 我运行了这个命令,但它不起作用。它也没有返回任何错误消息
  • move 之前插入和echo 命令,这样我们就可以看到已处理文件的名称...
  • 我在 (example*SOW*) do echo move "%a" "%~Pa\SOW" ' 中插入了 'echo' 命令'for /R %a' 当我运行这个命令时没有发生任何事情.我在这里遗漏了一些基本的东西吗?
  • 在您的问题的解释中,您说“运行命令:for /r %a in (example/*) do call sow.bat ...我收到一条消息,说'无法将多个文件移动到单个文件'”。我的解决方案使用 your for 命令并添加 move "%a" "%~Pa\SOW" 部分!请检查两个for 命令的区别。例如,在您之前的评论中,您错过了 in (example*SOW*) do 部分中的反斜杠...
  • 当我使用你的方法时,移动的文件被重命名为“SOW”,它们不再被识别为 Adob​​e 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多