2016-09-27 8 views
0

ファイルのショートカットをスタートメニューに送信するバッチスクリプトを作成しようとしていますが、「開始」オプションを設定する際に問題が発生しました。私はそれを行うためにShortcut from Optimum Xを使用しています。これは私のコードではなく、10年前の古いプログラムのエラーかもしれません。意図と "で開始" ファイルのディレクトリに設定してショートカットを作成するようバッチ%〜f1は動作しますが、スペースのため%〜dp1が失敗します

shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~f1" /a:c /t:%1 

作品を実行

  • %~f1 = C:\Program Files (x86)\Example\Example.exe
  • %~dp1 = C:\Program Files (x86)\Example\

。しかし、それは宇宙に遭遇したときにパスがプログラムに誤りがファイルされている場合

shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~dp1" /a:c /t:%1 

は、例えば、失敗した実行すると

「パラメータ 『ファイルは、』コマンドの構文無効

さですこれは十分な情報がない場合には正しくない」

The Error.

申し訳ありませんが、私は非常に少ないバッチを知っています。

答えて

1

問題はスペースではなく、標準の引数がどのように処理されるかです。

あなたの場合、内部コマンドにデータを渡すのではなく、独自のパーサー(default C startup code)を使用する外部実行可能ファイルにデータを渡しています。このパーサーには、バックスラッシュに続けて引用符を付けると、引き数を終了しないエスケープされた引用符になります。

あなた%~dp1は、バックスラッシュで終わるように、引用符をエスケープし、その引数は/tスイッチでProgram後のあなたのケースでは、最初の引用符で囲まれていないスペースまで続きます。したがって、Files/tスイッチ内)は有効な引数として認識されません。

通常のアプローチは、ここでforコマンドが追加点を持つファイルへのパスを処理するために使用される

for %%a in ("%~dp1.") do (
    shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%%~fa" /a:c /t:"%~1" 
) 

のようなもので終わるバックスラッシュを削除することです。このため、参照された要素(%%~fa)へのフルパスを取得すると、終了するバックスラッシュは含まれません。

ただし、ターゲットフォルダがドライブのルートである場合、この方法は機能しません。終了するバックスラッシュは削除できません。だから、別のアプローチは、単純に今の引用は、引数の終了引用符が続くエスケープバックスラッシュと見られる2つのバックスラッシュが先行するバックスラッシュ

shortcut /f:"%targetfolder%\%fileName%.lnk" /w:"%~dp1\" /a:c /t:"%~f1" 

をエスケープすることにより、引用花茎を避けるためです。

+0

私は物事を単純に保つために2番目の方法を使用し、それは完全に機能しました。私はエスケープとして\を見ていたと思ったことはないと思う。どうもありがとうございました! – TeeJay

関連する問題