2016-07-09 8 views
0

Windows CMDプロンプトの自動完了機能(他の端末と同様の機能)は、正しいパスやファイル名がわからないときに便利です。cmdバッチ内のオートコンプリートパス


ボトムラインは、バッチスクリプトでこの機能を使用する方法です。
例:
スクリプト
"C:\Program Files\Java\jre1.8.0_92\bin\javaw.exe" -jar post.jar
ここのものは、Javaのバージョンは常に同じではないということですので、この
"C:\Program Files\Java\jre*\bin\javaw.exe" -jar post.jar

+0

CMDには、このようなオートコンプリート機能はありません。 'jre *'と一致する複数のディレクトリがあった場合、これはどういう意味でしょうか?これに最も近いのは、目的のJREディレクトリをPATH変数に入れることです。次に、javaw.exeへのディレクトリパスを指定しません。 – lit

+0

これはまさに私が言おうとしているものです – Bil

+0

上記のバージョンをパラメータ化し、必要に応じて実行可能ファイルへのパスに単純に挿入することができます。 – ManoDestra

答えて

1

あなたができるようなものにするために必要なパスの途中でワイルドカードを使用しますが、最後(最後の要素)にすることができます。あなたはそれを分割、間にそれを必要とするので:

for /f "delims=" %%a in ('dir /b /ad /on "C:\Program Files\Java\jre*"') do set ver=%%a 
set "exec=C:\Program Files\Java\%ver%\javaw.exe" 
"%exec%" -jar post.jar 

つ以上がある場合、これは、あなたに最高のバージョン番号のパスを取得します。

+0

最後のコマンドは "%exec%" - jar post.jarにする必要があります。 – Bil

+0

@Bil良いキャッチです。編集されました。 – Stephan

+0

ありがとう@Stephan :) – Bil

0

Wildcards are supported by only some commands。また、cmd不明 Windowsシステムでは...最後のバックスラッシュの後ろのトークンでパス IEでファイルパスに

をワイルドカードを制限します。あなたは、環境変数の制御を持っていないならば、あなたは見つける必要がありますファイルのパス(_checkPath変数の割り当ては、私はjavaがインストールされていないよう合理的な出力を得るために変更されていることに注意)次のように:

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
    rem assign path with a wildcard * not in path leaf 
set "_checkPath=C:\Program Files\Java\jre*\bin\javaw.exe" 
    rem delete or comment-up next line i.e. my test data  set "_checkPath=..." 
set "_checkPath=%ProgramFiles%*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservr%1.exe" 
set "_itemFirst=" 
    rem previous line: delete variable; next line: show setting 
set _checkPath 
echo(--- 
    rem next two lines: ensure that a wildcard * not in path leaf is not allowed 
echo dir /B /S "%_checkPath%" 
dir /B /S "%_checkPath%" 
echo(--- 
    rem find all files by parsing powershell output (note proper escaping ^^^|) 
for /F "usebackq tokens= 1* delims=: " %%G in (` 
    powershell -C Get-ChildItem '"%_checkPath%"' -Recurse ^^^| Format-List -Property FullName 
    `) do (
     rem assign first found item 
    if not defined _itemFirst set "_itemFirst=%%~H" 
     rem assign every found item thus last found item 
    set "_item_Last=%%~H" 
     rem show every found item 
    echo .exe found %%~H 
) 
echo(--- 
    rem show setting found 
set _item 
echo(--- 
if defined _itemFirst (
    echo success: "%_checkPath%" 
     rem commands are merely ECHOed and (my test data) commented up 
     rem use found items (choose any) 
    rem ECHO "%_itemFirst%" -jar post.jar 
    rem ECHO "%_item_Last%" -jar post.jar 
) else (
    echo NOT FOUND "%_checkPath%" 
) 

コードスニペットの上に豊かにより良く理解するために、必要に応じてコメントしています。
出力は両方のバリアントを示しています

==> D:\bat\SO\38281447.bat XXX 
_checkPath=C:\Program Files*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservrXXX.exe 
--- 
dir /B /S "C:\Program Files*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservrXXX.exe" 
The filename, directory name or volume label syntax is incorrect. 
--- 
--- 
Environment variable _item not defined 
--- 
NOT FOUND "C:\Program Files*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservrXXX.exe" 

==> D:\bat\SO\38281447.bat 
_checkPath=C:\Program Files*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservr.exe 
--- 
dir /B /S "C:\Program Files*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservr.exe" 
The filename, directory name or volume label syntax is incorrect. 
--- 
.exe found C:\Program Files\Microsoft SQL Server\100\LocalDB\Binn\sqlservr.exe 
.exe found C:\Program Files\Microsoft SQL Server\110\LocalDB\Binn\sqlservr.exe 
.exe found C:\Program Files\Microsoft SQL Server\120\LocalDB\Binn\sqlservr.exe 
--- 
_itemFirst=C:\Program Files\Microsoft SQL Server\100\LocalDB\Binn\sqlservr.exe 
_item_Last=C:\Program Files\Microsoft SQL Server\120\LocalDB\Binn\sqlservr.exe 
--- 
success: "C:\Program Files*\Microsoft SQL Server\1*\LocalDB\Binn\sqlservr.exe" 

==> 
関連する問題