1つの変数がバッチ内の別の変数の先頭と一致するかどうかを確認します


0

バッチスクリプトでは、1つの変数が別の変数の先頭と一致するかどうかに従ってスクリプトフローをリダイレクトする必要があります。特に、私はこのようなことをしたいです:

IF %CD% BEGINSWITH %USERPROFILE% (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

この問題をオンラインで解決するもの、または少なくとも私にとって意味のあるものを見つけるのに苦労しました。これが実行可能であれば、実行可能なソリューションが機能する方法と理由を示してください。

回答:


1

Isziの答えは、多くの場合、動作しているように見えますが、それは多くの状況下で誤った結果を与えることができます。

  • 大文字小文字の違いがある場合、FINDSTR検索は適切に一致しない可能性があります。/Iオプションを使用して解決しました。

  • FINDSTRは、プロファイル名にスペースが含まれている場合、検索文字列を2つ以上の検索文字列として扱います。/C:"searchString"オプションを使用することをお勧めします。

  • FINDSTR %USERPROFILE%は、などの正規表現メタ文字を含む場合、正規表現検索を実行し.ます。これは、/Lオプションまたはオプションを使用してリテラル検索を強制することで解決でき/C:"searchString"ます。

  • FINDSTRではエスケープ文字として使用されるため、バックスラッシュはFINDSTRでは少し注意が必要です。すべてのバックスラッシュをとして安全にエスケープします\\

  • 現在のディレクトリ名にのような特殊文字が含まれている場合、ECHOコマンドは失敗する可能性があり&ます。このCDコマンドは、特殊文字を心配することなく、現在のディレクトリを安全に印刷します。

また、FINDSTRはテストとして使用されており、一致する行を表示することに関心がないため、出力はNULにリダイレクトされる必要があります。

そして最後に、IFステートメントを条件&&||演算子に置き換えることにより、ソリューションを簡素化できます。

次のコードは常に機能するはずです。

cd|findstr /bic:"%userprofile:\=\\%" >nul&&echo You can do stuff here!||echo You don't belong here!

更新-さまざまなドライブ文字の大文字小文字の例

Windows 7のcmd.exeセッションは、ドライブ文字CD(または%CD%)によって報告されるドライブ文字の大文字と小文字の違いを示しています。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\>set userprofile
USERPROFILE=C:\Users\Dave

C:\>cd c:\users\Dave

c:\Users\Dave>cd
c:\Users\Dave

c:\Users\Dave>echo CD=%CD%
CD=c:\Users\Dave

c:\Users\Dave>cd..

c:\Users>cd C:\users\Dave

C:\Users\Dave>cd
C:\Users\Dave

C:\Users\Dave>echo CD=%CD%
CD=C:\Users\Dave

C:\Users\Dave>

この特定のスクリプトでは、/Iオプションは必要ありません。ユーザー入力なしでコマンド出力や環境変数を照合しているため、大文字と小文字が一致しない可能性は事実上ゼロです。ただし、説明してくれてありがとう。
イスジ

@Iszi-実際には、現在のディレクトリの指定方法に応じてドライブ文字を小文字または大文字で報告する/IことCDがあるため、スイッチが必要です。また、%USERPROFILE%値は実際のフォルダ名の大文字と小文字を一致させる可能性が最も高いですが、大文字と小文字を一致させる必要はありません。
dbenham

よくわかりません。どのようにCDフォルダに移動しても、その後CD引数なしで実行すると、適切な(ファイルシステムに格納されている)場合にパスが返されます。%USERPROFILE%また、適切な場合にユーザーのプロファイルパスを返します。エルゴ、CD /D c:\users\me次の出力CD(引数なし)が完全C:\Users\Meに一致する%USERPROFILE%場合-大文字と小文字-すべてを実行する場合は、「Me」としてコマンドを実行しています。
イッツィ

@Iszi -更新の答えを参照してください
dbenham

面白い。私はそのことを一度も観察したことも、少なくとも気づいたこともありませんでした。繰り返しますが、私が使用する場合(ユーザーはエクスプローラーウィンドウからスクリプトをダブルクリックするだけです)、ポイントはまだ重要ではありません-しかし、これは非常に良い情報です。ありがとう!
イスジ

0

私は自分でそれを理解することになりました。このソリューションが他のどこにも気付かなかった理由はよくわかりません。

ECHO %CD%|FINDSTR /B "%USERPROFILE%"
IF %ERRORLEVEL% EQU 0 (Echo You can do stuff here!) ELSE (Echo You don't belong here!)

通常、FINDSTR特定のテキストファイルで文字列を検索します。ただし、代わりにパイプラインからの入力を受け入れることもできます。ここではECHO、現在のディレクトリ(%CD%)をパイプラインに配置し、パイプされたデータの先頭()でFINDSTRユーザーのプロファイルフォルダー("%USERPROFILE%"-引用符は必須)を探すように指示します/B

FINDSTR返すのでERRORLEVEL、後のIFステートメントでこれを確認し、それに応じて続行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.