none
「送る」で呼び出すPowerShellスクリプトで、ファイルパスがうまく受け取れない RRS feed

  • 質問

  • SendToに以下のショートカットを作って、渡されたファイルを扱いたいです。

    %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -noexit "C:\work\args.ps1"

    エクスプローラで選んだファイルのフルパスに「空白」が含まれて無ければ、問題ないのですが
    「C:\Program Files (x86)\misc\someone.txt」 みたいなファイルを渡そうとすると
    以下のように表示されてスクリプトの処理に至らないようです。

    用語 'x86' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプロ
    グラムの名前として認識されません。名前が正しく記述されていることを確認し、パス
    が含まれている場合はそのパスが正しいことを確認してから、再試行してください。

    何か回避策、あるいはアイディアがあれば教えていただけませんか?


    Inohara

    2013年3月5日 2:12

回答

  • すみません、自己解決してしまいました。

    SendToに作ったショートカットに「-f」を足して、以下のように修正したら、空白を含むファイル名を引き渡す事ができました。

    %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -f "C:\work\args.ps1"

    お騒がせしました。


    Inohara

    2013年3月5日 2:48

すべての返信

  • すみません、自己解決してしまいました。

    SendToに作ったショートカットに「-f」を足して、以下のように修正したら、空白を含むファイル名を引き渡す事ができました。

    %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -f "C:\work\args.ps1"

    お騒がせしました。


    Inohara

    2013年3月5日 2:48
  • 追記。

    -f をつけてスクリプトを実行すると、スクリプトの中でまで空白が区切り文字として機能しなくなりました。
    とりあえず、変数のスコープを拡げることで回避しましたが、もっとスマートな方法はないんですかねえ?

    # 以下、参考
    # こういうスクリプトだと $filename1 が "c:\temp\moto.txt c:\temp\moto.zip"みたいになりました。
    param(
     [String]$sourcefilename
    )

    function ZipFile
    {
     param([String]$filename1, $filename2)
     if(test-path($filename1))
     {
      // $filename2 という名前のzipファイルを作って、$filename1を入れる処理
     }
    }

    $zipfilename = [System.IO.Path]::ChangeExtension($sourcefilename, ".zip")

    ZipFile $sourcefilename $zipfilename


    Inohara

    2013年3月5日 6:11
  • つながった一つの文字列になるのはパラメータの型を[String]としているからです。

    $argsはObjectの配列としてスクリプトに渡されています。


    2017年4月18日 13:17
  • あぜちさんのおっしゃる通り、$args変数を使う方法も手ですが、以下のようにParameter属性を用いて、パラメータに引数(渡されたパスのリスト)をバインドすることも可能です。

    パラメータにバインドすることの利点は、型を指定できること、他のパラメータも定義できること等です。

    param(
        [parameter(ValueFromRemainingArguments = $true)]
        [String[]]
        $Path
    )
    
    foreach($p in $Path)
    {
        Write-Host "source:" $p
    }
    

    2017年4月18日 23:55
    モデレータ