"Path cannot be found" 纠缠测试结果
"Path cannot be found" Pester Test Results
我正在 Pester 上测试脚本。我一直收到找不到路径的错误。
显然我的某些台词有问题。
$userFolders = Get-ChildItem C:\Users -Directory
foreach($folder in $userFolders)
{
Get-ChildItem C:\Users$folder\AppData\Local\Temp -Recurse | Remove-Item -Recurse -Force
Get-ChildItem C:\Users$folder\AppData\Local\Google\Chrome\User Data\Default\Cache -Recurse | Remove-Item -Recurse -Force
}
Get-ChildItem C:\Windows\Temp -Recurse | Remove-Item -Recurse -Force
我似乎找不到问题所在,但我知道它就在这里。
任何帮助将不胜感激。
你的路径之一有一个 space 所以需要用引号引起来:
Get-ChildItem "C:\Users$folder\AppData\Local\Google\Chrome\User Data\Default\Cache" -Recurse | Remove-Item -Recurse -Force
需要加双引号,这样$folder
变量还是会展开的
可能不是每个用户文件夹都有 'Google' 子目录
C:\Users$folder\AppData\Local\**Google**\...
$folder
是一个对象。转换为字符串将为您提供文件夹名称。您可以使用引号来做到这一点。
作为 ,如果路径中有 space,您还需要引号。
$userFolders = Get-ChildItem C:\Users -Directory
foreach($folder in $userFolders) {
Write-Host "This is the folder object:"
$folder
Write-Host "This is folder object cast to string: $folder"
Get-ChildItem "C:\Users$folder\AppData\Local\Temp" -Recurse | Remove-Item -Recurse -Force
Get-ChildItem "C:\Users$folder\AppData\Local\Google\Chrome\User Data\Default\Cache" -Recurse | Remove-Item -Recurse -Force
}
Get-ChildItem C:\Windows\Temp -Recurse | Remove-Item -Recurse -Force
其他答案指出了您脚本中的主要缺陷,即缺少引号。在两个方面也有一些冗余。
- 重复
Get-ChildItem <something> | Remove-Item <something>
- 管道两边递归
考虑以下因素:
function Get-TempFolderItem {
foreach ($Local in (Get-ChildItem -Path "C:\Users\*\AppData\Local")) {
'Temp','Google\Chrome\User Data\Default\Cache' |
ForEach-Object { Get-ChildItem -Path "$Local$_" -Recurse }
}
}
Get-TempFolderItem | Remove-Item -Force
此处重复较少,如果您犯了错误,可以简化调试。如果目录内容的获取是详尽无遗的,则不必删除。
因为您是说这是在测试的上下文中,所以您可能应该研究模拟以进行诸如删除文件之类的操作。对于临时文件,删除不想要的内容并不重要,但通常这是测试时需要避免的事情。
你可以写
Mock Remove-Item {}
在 Describe
块内。
希望这个回答对你有用。
我正在 Pester 上测试脚本。我一直收到找不到路径的错误。 显然我的某些台词有问题。
$userFolders = Get-ChildItem C:\Users -Directory
foreach($folder in $userFolders)
{
Get-ChildItem C:\Users$folder\AppData\Local\Temp -Recurse | Remove-Item -Recurse -Force
Get-ChildItem C:\Users$folder\AppData\Local\Google\Chrome\User Data\Default\Cache -Recurse | Remove-Item -Recurse -Force
}
Get-ChildItem C:\Windows\Temp -Recurse | Remove-Item -Recurse -Force
我似乎找不到问题所在,但我知道它就在这里。 任何帮助将不胜感激。
你的路径之一有一个 space 所以需要用引号引起来:
Get-ChildItem "C:\Users$folder\AppData\Local\Google\Chrome\User Data\Default\Cache" -Recurse | Remove-Item -Recurse -Force
需要加双引号,这样$folder
变量还是会展开的
可能不是每个用户文件夹都有 'Google' 子目录
C:\Users$folder\AppData\Local\**Google**\...
$folder
是一个对象。转换为字符串将为您提供文件夹名称。您可以使用引号来做到这一点。
作为
$userFolders = Get-ChildItem C:\Users -Directory
foreach($folder in $userFolders) {
Write-Host "This is the folder object:"
$folder
Write-Host "This is folder object cast to string: $folder"
Get-ChildItem "C:\Users$folder\AppData\Local\Temp" -Recurse | Remove-Item -Recurse -Force
Get-ChildItem "C:\Users$folder\AppData\Local\Google\Chrome\User Data\Default\Cache" -Recurse | Remove-Item -Recurse -Force
}
Get-ChildItem C:\Windows\Temp -Recurse | Remove-Item -Recurse -Force
其他答案指出了您脚本中的主要缺陷,即缺少引号。在两个方面也有一些冗余。
- 重复
Get-ChildItem <something> | Remove-Item <something>
- 管道两边递归
考虑以下因素:
function Get-TempFolderItem {
foreach ($Local in (Get-ChildItem -Path "C:\Users\*\AppData\Local")) {
'Temp','Google\Chrome\User Data\Default\Cache' |
ForEach-Object { Get-ChildItem -Path "$Local$_" -Recurse }
}
}
Get-TempFolderItem | Remove-Item -Force
此处重复较少,如果您犯了错误,可以简化调试。如果目录内容的获取是详尽无遗的,则不必删除。
因为您是说这是在测试的上下文中,所以您可能应该研究模拟以进行诸如删除文件之类的操作。对于临时文件,删除不想要的内容并不重要,但通常这是测试时需要避免的事情。
你可以写
Mock Remove-Item {}
在 Describe
块内。
希望这个回答对你有用。