回答:
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
ことCD
があるため、スイッチが必要です。また、%USERPROFILE%
値は実際のフォルダ名の大文字と小文字を一致させる可能性が最も高いですが、大文字と小文字を一致させる必要はありません。
CD
フォルダに移動しても、その後CD
引数なしで実行すると、適切な(ファイルシステムに格納されている)場合にパスが返されます。%USERPROFILE%
また、適切な場合にユーザーのプロファイルパスを返します。エルゴ、CD /D c:\users\me
次の出力CD
(引数なし)が完全C:\Users\Me
に一致する%USERPROFILE%
場合-大文字と小文字-すべてを実行する場合は、「Me」としてコマンドを実行しています。
私は自分でそれを理解することになりました。このソリューションが他のどこにも気付かなかった理由はよくわかりません。
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
ステートメントでこれを確認し、それに応じて続行できます。
/I
オプションは必要ありません。ユーザー入力なしでコマンド出力や環境変数を照合しているため、大文字と小文字が一致しない可能性は事実上ゼロです。ただし、説明してくれてありがとう。