2017-01-02 13 views
1

例えば、私は私の区切り文字として\で、このような単一の行を解析したいと思います:見た目 - なぜトークン= *私のために働かないのですか?

c:\some directory\another directory\filename.ext 

だから私は、変数を設定します。

set mydir=c:\some directory\another directory\filename.ext 

このディレクトリには、すべての時間を変更します私はスクリプトを実行するので、どれくらいのトークンが文字列に入るのか分からないかもしれませんが、最終的には最後のトークンを差し引いた全体を収集したいと思います。問題は、すべてのトークンを使って構文解析をテストしようとするときにも、私が期待した結果を返すことができないということです。

私は

c: some directory 

を取得しかし、私は

For /F "delims=\ tokens=*" %a in ("%mydir%") do echo %a %b 

を使用する場合、私は

c:\some directory\another directory\filename.ext b% 
を取得

For /F "delims=\ tokens=1-2" %a in ("%mydir%") do echo %a %b 

使用する場合0

なぜこれが起こっていますか? tokens=*を使用すると、区切り記号を無視しているようです。あなたがしたいと主張する(しかし、私は必要とされて% Sを倍増してきたように、私はそれが

c: some directory 
+3

'*'手段へのラインの残りの部分は、1つのトークンにすべてをかけます。通常のメソッド 'echo%〜dp1'では何が問題になっていますか? 'call /? 'を参照してください。 –

+1

FORコマンドのヘルプを参照してください。特に最後のセクション。 – Squashman

+0

**絶対に 'for/F'とその' tokens'/'delims'を使ってパスを操作/変更/分割することは絶対にしないでください!前のコマンドが指摘しているように、すべてのパスを正しく処理するより良い方法があります(特殊パス(相対パス、ドライブのルートディレクトリ、 '。\ sub \ .. \ *' ...など)しても!ところで、あなたのコードフラグメントにはいくつかのタイプミスがあります - それらを修正してください(それらを再入力するのではなく、コピー/ペーストしてください)... – aschipfl

答えて

2
For %%a in ("%mydir%") do echo %%~dpa 

を表示することを期待

はあなたに「全体刺され、マイナス最後のトークン」を示す必要がありますmetavariables

)プロンプトからバッチファイルではなく、直接に理由tokens=*があなたのために「作業」(すなわち。)あなたはそれを行うことを期待して何をしていませんトークン*remainder of the string, past the last tokend number specifiedを意味していることです。あなたはトークンを指定していないので、文字列の "残りの部分"は文字列全体です。

あなたが%%aへの最初のトークンを割り当てtokens=1,2,*%%b 2番目と%%cに文字列の残りの部分を使用したいので、あなたは、第一及び第二のトークンを選択しているc some directoryをしたい場合。 2*の間のカンマは任意です(また、1-2*も許可されます)。

この場合、c:%%aに割り当てられる、%%bからsome directory%%c

関連する問題