質問

Here I have a PowerShell script which opens all jpg files in a folder in mspaint to save them. It repairs exif thumbs and lessens file size.

The problem is that it can't send mspaint jpg files which have spaces in their paths. So how do I make Start-process to get the literal path of the jpg files?

$kansio = ($args[0]).replace("'","")
$tiedostot = 0
Write-Host "Folder to process: $kansio" -foregroundcolor White

Get-ChildItem -LiteralPath $kansio | foreach{if($_.Extension -eq ".jpg"){$_.FullName}} |
foreach{
    $id = (Start-process mspaint $_ -ea 0 -PassThru).Id
    $vikaTallennus = (Get-ChildItem -LiteralPath $_).LastWriteTime
    [bool]$onnistui = 0

    [void][System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
    [void][System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")

    do
    {
        try
        {
            if((Get-Process -Id $id -ea 'stop').WaitForInputIdle())
            {
                [Microsoft.VisualBasic.Interaction]::AppActivate($id)
                [System.Windows.Forms.SendKeys]::SendWait("^s")
                [System.Windows.Forms.SendKeys]::SendWait("{esc}")
                for($i=1; $i -le 10; $i++)
                {
                    if((Get-ChildItem -LiteralPath $_).LastWriteTime -gt $vikaTallennus)
                    {
                        try
                        {
                            Stop-Process -Id $id -force -ea 'stop'
                            Write-Host "Done: $_" -foregroundcolor Green
                            $onnistui = 1
                            break
                        }
                        catch
                        {
                            #Write-Host "Failed to close the process" -foregroundcolor Red
                            #Start-Sleep -milliseconds 100
                        }
                    }
                }
            }
        }
        catch
        {
            #Write-Host "Failed to catch the process" -foregroundcolor Red
            #Start-Sleep -milliseconds 100
        }
    }
    until((Get-Process -Id $id -ea 0) -eq $null -or $id -eq $null)
    if($onnistui){$tiedostot++}else{Write-Host "Failed: $_" -foregroundcolor Red}
}
Write-Host "Files saved: $tiedostot" -foregroundcolor Green
役に立ちましたか?

解決

You will need to wrap your file argument in quotation marks else mspaint will think you're trying to supply 3 arguments separated by a space. Try this:

Get-ChildItem -LiteralPath $kansio -filter "*.jpg" | foreach{
    $file = $_.fullname
    $id = (Start-process mspaint """$file""" -ea 0 -PassThru).Id
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top