【问题标题】:Error with recursive deletion in WindowsWindows 中的递归删除错误
【发布时间】:2017-03-25 23:50:05
【问题描述】:
我目前正在卸载一些为大量文件生成数据的软件,全部为.jpg 和.nfo,我想删除这些文件。我正在尝试使用 PowerShell 执行此操作,我尝试过的命令是:
del /S *.jpg
结果收到如下:
Remove-Item:找不到接受参数“*.jpg”的位置参数。
在 line:1 char:1
+ del /S *.jpg
+ ~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Remove-Item], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
谢谢!
【问题讨论】:
标签:
windows
powershell
delete-file
【解决方案1】:
tl;dr
任一:按原样运行cmd.exe 命令,为其添加前缀cmd --% /c:
cmd --% /c del /S *.jpg
@ 987654326@,停止解析符号,告诉 PowerShell 停止解析剩余的参数并按原样传递它们(除了扩展 %<name>% 环境变量引用) - 请参阅 Get-Help about_Parsing。
-
或者:最好使用PowerShell原生的Remove-Item cmdlet:
Remove-Item * -Recurse -Include *.jpg -WhatIf
请注意common parameter-WhatIf 如何方便地让您在提交操作之前预览操作;见Get-Help Remove-Item。
-
注意:从 PSv5.1 开始,
Remove-Item、Copy-Item 和 Move-Item cmdlet 以及在较小程度上,Get-ChildItem 在涉及递归操作和 @ 987654337@ 和 -Exclude 参数 - 有很多微妙之处。
然而,总的来说,PowerShell 的 cmdlet 比它们的 cmd.exe 对应物强大得多,学习如何有效使用它们的任何努力都是值得的 - 尤其是因为您很快就能在 Unix 平台也是如此。
cmd.exe del 和 dir 等命令内置在 cmd.exe 中,不能从 PowerShell 直接调用;要调用它们,您必须使用cmd /c 显式调用cmd.exe,如上所示。
可能令人困惑的是,PowerShell 为其 自己的 命令 (cmdlet) 定义了 aliases,该命令以它们的大致 等效 @987654346 命名@同行。
PowerShell cmdlet 的真实名称非常不同,在冗长之后,但 very consistent naming scheme(甚至控制 PowerShell-native 别名的命名)。
例如,del 是 PowerShell 的 Remove-Item cmdlet 的别名。
这种别名是一把双刃剑:一方面,它使习惯cmd.exe(批处理编程)的人更容易发现他们的PowerShell对应物;另一方面,它掩盖了 PowerShell 的命令行语法完全不同这一事实。
要了解 PowerShell 在您键入名称时实际调用的命令,请使用 Get-Command:
> Get-Command del
CommandType Name Version Source
----------- ---- ------- ------
Alias del -> Remove-Item
如您所见,您也可以将-? 传递给Get-Help 并使用别名 形式的命令调用。
【解决方案2】:
您正在寻找:
Get-ChildItem {Path to root of folder to search from} -Recurse | Where-Object (($_.FullName -like "*.jpg") -or ($_.FullName -like "*.nfo")) | Remove-Item -Force
我尚未对此进行测试,因为我正在使用该应用程序在我的 iPhone 上写作,所以如果有错误,请告诉我,我会修复它。