【发布时间】:2020-10-17 04:14:12
【问题描述】:
我的一个朋友让我为他写一个简短的脚本。该脚本应检查特定文件夹,查找所有早于 X 天的文件和子文件夹并将其删除。到目前为止,我写了脚本,在自己的系统上成功测试并发送给他。事情是这样的——它在他的系统上不起作用。更具体地说,Get-ChildItem cmdlet 不会为提供的路径返回任何内容,但它甚至会变得更奇怪,稍后会详细介绍。我使用以下代码首先查找文件和文件夹(并在以后删除它们之前记录它们):
$Folder = "D:\Data\Drive_B$\General\ExchangeFolder"
$CurrentDate = Get-Date
$TimeSpan = "-1"
$DatetoDelete = $CurrentDate.AddDays($TimeSpan)
$FilesInFolder = (Get-ChildItem -Path $Folder -Recurse -ErrorAction SilentlyContinue | Where-Object {$_.LastWriteTime -lt $DatetoDelete})
所有变量都已填满,我们都知道文件夹已填满了超过一天的文件和子文件夹,这是我们为测试选择的时间跨度。现在,有趣的部分是 Get-ChildItem 不仅不返回任何内容 - 转到文件夹本身并输入“dir”也不返回任何内容。从来没有见过这样的行为。我已经检查了我能想到的所有内容 - 是否是 DFS?、拼写错误、文件夹权限、共享权限、隐藏文件、ExecutionPolicy。一切都应该是为了让这个脚本像在我自己的系统上一样在最初测试它时正常工作。该脚本不会返回任何错误。
所以由于某种原因,powershell找不到文件夹的内容。有谁知道为什么会发生这种情况?我在这里不知所措:-/
感谢您的时间和帮助,
弗雷德
【问题讨论】:
-
-ErrorAction SilentlyContinue对错误检测没有任何帮助。你应该试试-ErrorAction Stop -
好吧,
dir和Get-ChildItem在 Powershell 中实际上是一样的。运行Get-Alias dir看看我的意思。尝试进入cmd.exe并为目录运行dir。 -
由于路径中有美元符号(用于变量),您应该使用单引号来防止 PowerShell 解释它:
$Folder = 'D:\Data\Drive_B$\General\ExchangeFolder' -
顺便说一句:DateTime.AddDays() 将 [double] 作为参数,而不是字符串,因此请在此处去掉引号:
$TimeSpan = -1 -
根据@iRon 的评论,这确实是问题所在,您也可以使用
"D:\Data\Drive_B`$\General\ExchangeFolder"转义$
标签: powershell directory path get-childitem shared-directory