Delete Files in subfolders after encode

时间秒杀一切 提交于 2021-02-10 15:48:25

问题


I want to delete files in my subfolders with a PowerShell script.

I already tried using Remove-Item in PowerShell, but failed to set it up correctly...

This is the code I use for encoding:

Get-ChildItem *.mkv | where BaseName -notlike '*`[HEVC]' | foreach {
ffmpeg -i $_ -c:v libx265 -c:a copy -x265-params crf=25 "$($_.BaseName) [HEVC].mkv" -n
}

I want to either include Remove-Item [source file] in this script to delete the source files by checking the name of the file.

How would I do that?


回答1:


Make your pipeline output the file-info objects of those input files whose conversion via ffmpeg was successful (as implied by automatic variable $LASTEXITCODE equaling 0), and pipe them to Remove-Item:

The command below sends ffmpeg's (stdout) output to the display only, via Write-Host, so as not to "pollute" the pipeline with its stdout output and only output the file-info objects; the alternative is to simply suppress ffmpeg's output (error messages still print): $null = ffmpeg ...:

Get-ChildItem *.mkv | where BaseName -notlike '*`[HEVC]' | foreach {
  # Convert the input file and send ffmpeg's output to the display,
  # by piping to Write-Host, rather than trough the pipeline.
  ffmpeg -i $_ -c:v libx265 -c:a copy -x265-params crf=25 "$($_.BaseName) [HEVC].mkv" -n |
    Write-Host
  # Conversion OK? Output the file-info object, which pipes it to Remove-Item.
  if ($LASTEXITCODE -eq 0) { $_ } 
} | Remove-Item -WhatIf

Note: The -WhatIf common parameter in the command above previews the operation. Remove -WhatIf once you're sure the operation will do what you want.

Note: Since Write-Host in PowerShell version 5 or above writes to the information stream (stream number 6), which goes to the display by default, it is still possible to capture ffmpeg's output from inside PowerShell, namely via redirection 6>&1; by contrast, a caller from outside PowerShell (such as a batch file) receives even Write-Host output directly via stdout.


In PowerShell 7+ you can simplify the code inside the foreach loop via &&, the pipeline-chain AND operator (its complementary OR (else) operator is ||):

# (Details of the ffmpeg command omitted for brevity).
... | foreach {
  # The RHS of && is only executed if the command on the LHS succeeded, 
  # which in the case of external programs means: $LASTEXITCODE equals 0.
  ffmpeg $_ ... | Write-Host && $_
} | ...


来源:https://stackoverflow.com/questions/64634967/delete-files-in-subfolders-after-encode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!