我希望这可以递归每个目录,并为每个文件创建一个零字节文件,使用与添加了扩展名.xxx的文件相同的名称。我在想New-Item
在这里使用会很好,但我似乎无法让它正常工作。
以下是我在PS版本2中尝试过没有成功的内容:
$drivesArray = Get-PSDrive -PSProvider 'FileSystem' | select -Expand Root
foreach ($drive in $drivesArray) {
ls "$drive" | where {
$_.FullName -notlike "${Env:WinDir}*" -and
$_.FullName -notlike "${Env:ProgramFiles}*"
} | ls -ErrorAction SilentlyContinue -recurse | where {
-not $_.PSIsContainer -and
$_.Extension -notmatch '\.xxx|\.exe|\.html'
} | New-Item -Path { $_.BaseName } -Name ($_.FullName+".xxx") -Type File -Force
}
错误
无法找到接受参数“+ xxx”的位置参数。
答案 0 :(得分:1)
您需要在Get-ChildItem
语句中包含第二个ls
(New-Item
)和ForEach-Object
。另外,请勿将$_.Basename
作为New-Item
的路径传递。这样做是这样的:
New-Item -Path ($_.FullName + '.xxx') -Type File -Force
或者像这样:
New-Item -Path $_.Directory -Name ($_.Name + '.xxx') -Type File -Force
修改后的代码:
foreach ($drive in $drivesArray) {
Get-ChildItem $drive | Where-Object {
$_.FullName -notlike "${Env:WinDir}*" -and
$_.FullName -notlike "${Env:ProgramFiles}*"
} | ForEach-Object {
Get-ChildItem $_.FullName -Recurse -ErrorAction SilentlyContinue
} | Where-Object {
-not $_.PSIsContainer -and
$_.Extension -notmatch '^\.(xxx|exe|html)$'
} | ForEach-Object {
New-Item -Path ($_.FullName + '.xxx') -Type File -Force
}
}