【问题标题】:Powershell Script runs but nothing happensPowershell 脚本运行但没有任何反应
【发布时间】:2017-02-13 16:46:42
【问题描述】:

我试图让这个脚本根据文件名进行子目录比较,然后只比较 30 天或更早的文件。语法似乎可以接受,但 HandbrakeCLI 编码无法启动。

    Clear screen
    $SourceDir = "\\netshare\testing\Source\*.MP4"
    $DestinationDir = "\\netshare\testing\Completed_mp4\*.MP4"
    $s1 = get-childitem -path $SourceDir -Recurse -Force | Where-Object        {$_.LastWriteTime -gt (Get-Date).addDays(-30)}
    $d1 = get-childitem -path $DestinationDir -Recurse
    $results = @(compare-object $s1 $d1) | Where-Object {$_.Name -ne $_.Name}
    $quantity = $results | measure
    $Filecount = $quantity

    $Process = 0;
    foreach ($result in $results){

    Write-Host -----------------------------------------------------------------    
    Write-Host Handbrake Batch Encoding
$Process++;
$results = $file.DirectoryName + "\" + $file.BaseName + ".MP4";

$progress = ($Process / $filecount) * 100
    $progress = [Math]::Round($progress,2)

    #Clear-Host
    Write-Host "Processing - $results"
    Write-Host "File $Process of $Filecount - $progress%"
    Write-Host -------------------------------------------------------------------------------
$s1 = get-childitem -path $SourceDir -Recurse -Force | Where-Object {$_.LastWriteTime -gt (Get-Date).addDays(-30)}
$d1 = get-childitem -path $DestinationDir -Recurse
Start-Process "C:\Users\Downloads\HandBrakeCLI-1.0.1-win-x86_64.exe -ArgumentList -q 25 -i '$results' -o '$d1'"
}

【问题讨论】:

    标签: powershell powershell-4.0 handbrake


    【解决方案1】:
    $results = @(compare-object $s1 $d1) | Where-Object {$_.Name -ne $_.Name}
    

    将是一个很好的开始。这不会返回任何结果,除非 $_.Name 是 NaN(这不太可能)。

    一旦你修复了应该有一个错误消息

    C:\Users\Downloads\HandBrakeCLI-1.0.1-win-x86_64.exe -ArgumentList -q 25 -i '$results' -o '$d1'
    

    无法运行。

    请注意,您在整行周围使用引号,有效地告诉Start-Process,整个事情就是要运行的程序。它不是。

    这里无论如何都不需要Start-Process,不过,你应该可以使用

    C:\Users\Downloads\HandBrakeCLI-1.0.1-win-x86_64.exe -q 25 -i $results -o $d1
    

    (另请注意,由于您使用单引号,您将$results 和$d1 逐字传递给程序而不是变量内容。此外,我很确定您需要在@ 的参数之间使用逗号987654330@ 而不是空格,因为那是正常的 PowerShell 参数绑定行为。)

    这里还有很多其他错误:

    1. Clear screen 可以是 clear、cls 或 Clear-Host。 screen 什么都不做。
    2. $quantity = $results | measure 应该是 $quantity = ($results | measure).Count 或简单的 @($results).Count。否则,您将无法在几行之后得到您想要的输出。

    【讨论】:

    • 非常感谢乔伊。
    • 似乎 for each object 循环没有填充 $results 变量。
    • 如何重写 $results = @(compare-object $s1 $d1) | Where-Object {$_.Name -ne $_.Name} 所以它比较两个目录的文件名并忽略匹配项。仅将不匹配的文件名传递给手刹?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多