PHPからファイルパスをパラメータとして実行ファイルに渡したい場合、ファイルパスにスペースが含まれる可能性があります。実行ファイルはパラメータの前後で引用符を処理していないようですので、長い名前の代わりに短いDOS名を渡すことができます。PHPからファイルの短いDOS名を取得できますか?
PHPは、旧式のDOS 8.3ファイル名について何か知っていますか?
PHPからファイルパスをパラメータとして実行ファイルに渡したい場合、ファイルパスにスペースが含まれる可能性があります。実行ファイルはパラメータの前後で引用符を処理していないようですので、長い名前の代わりに短いDOS名を渡すことができます。PHPからファイルの短いDOS名を取得できますか?
PHPは、旧式のDOS 8.3ファイル名について何か知っていますか?
COM/.net extension built-inのphp/win32が必要です。これを使用してWSH FileSystemObjectを作成し、のShortPath propertyを照会することができます。
<?php
$objFSO = new COM("Scripting.FileSystemObject");
$objFile = $objFSO->GetFile(FILE);
echo "path: ", $objFile->Path, "\nshort path: ", $objFile->ShortPath;
プリント
path: C:\Dokumente und Einstellungen\Volker\Desktop\test.php short path: C:\DOKUME~1\Volker\Desktop\test.php
スペースをバックスラッシュするのはどうですか?
Home/My Documents/ --> Home/My\ Documents/
escapeshellarg()
を見て、パラメータを二重引用符で囲んでください。
私はそれもうまくいくと思っていました。それは私がdirコマンドを実行すると動作しますが、私が実行しようとしているコマンドを実行すると動作しません。 –
実行ファイルをエスケープするにはescapeshellcmd()を使用し、引数にはescapeshellarg()を使用します。 –
提案してくれてありがとう、しかし私はescapeshellcmdを全く理解していない。 Windowsでは、特殊文字をスペースで置き換えるように見えます。 'C:\ Documents and Settings \ don \ foo'は 'C:Documents and Settings don foo'になります。それはどのように役立つのですか? –
WindowsのKernel32にはGetShortPathName APIが必要です。 PHPから呼び出すには、Win32 API extension ...
これはおそらくもっと速いでしょう。残念ながら、PHP 5.3rc2のビルドにはw32モジュールがなくてテストできません。 - /あなたの投稿へのリンクを追加しても構いません。 – VolkerK
私が実行しようとしている実行可能ファイルは、バックスラッシュを名前の一部として扱います。あなたの例では、ファイルを開こうとします。Home/My \ –
おそらくphphilが示唆するようにescapeshellargが必要です。コマンドラインから直接呼び出す場合は、バックスラッシュでエスケープしてください –