バッチスクリプトの質問 - 変数に変数を検索し、置き換えますか?
-
25-09-2019 - |
質問
私は問題を抱えています。私はUNIXのcdコマンドを模倣したバッチファイルを持っています。それは、(例えば、そのディレクトリに、upath2呼ばVARとして保存し、Windowsスタイルのパスに変換し、それをユーザーが入力したUNIX形式のパスを受け取り、そしてCDの「/プログラムファイル/ 7-ZIP」「Cになります: \プログラムファイル\ 7-ジップ」)。 Windowsライクな出力がupath2という名前のVARとして保存され、cmd
のcd
コマンドが実行され、そのディレクトリに変更します。
は、この「UNIX」cdコマンドと一緒に、私はまた、私にはbashのようなプロンプトを与える「bashemu.bat」と呼ばれるバッチファイルを作成しました。コマンドはすべての.batコマンドのすべてを保持する私が作成したbinとUSR \ binにフォルダへのリンクDOSKEYエントリ、です。私はDOSKEYエイリアスを入力して、私のUNIX形式のコマンドのすべてを起動することができるようになりますように、それから、最後に「CMD / V / K」を実行する。
さて、ここで私の問題だ:私は私のCのサブディレクトリにCD-INGの午前とき:\ Users \ユーザーxplinux557フォルダ bashemu変化のプロンプト(「unixhome」という環境変数に格納されている)
xplinux557@bash-pc:~$
に、例えばます:
xplinux557@bash-pc:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$
私はフルupath2変数を読み込み、unixhomeによって定義されるように、それは(ホームパスが含まれているかどうかを確認するために、cdコマンドを取得しようとしていますので、はこのようなパスは、コマンドプロンプトでbashemu以内に快適に使用するためには長すぎます)と単に〜とそれを交換してください。これは、これを有効にする必要があります:
xplinux557@bash-pc:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$
この中に
xplinux557@bash-pc:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$
AAAAH、はるかに良いです!私の最初のアプローチは、WindowsスタイルのパスにupathのUNIX形式のパスを変換し、新しいVARのupath2に名前を付け、「〜」でテキスト%unixhome%を置き換えることでした。
:これは、そのコードは次のように見えた方法でした:: set the batch file to retrieve all text from its parameters and replace all
:: unix-style slashes the user put in and replace those with a windows-style backslash
@echo off
set upath=%*
set upath=%upath:/=\%
:: cd to the directory that the user typed in, windows-style
cd "%upath%"
:: Set the upath2 var to the current directory and replace whatever unixhome was
:: a "~"
set upath2=%cd:%unixhome%="~"%
:: Remove the "C:" or "D:" from the quote
set upath2=%upath2:~2%
:: then, set the prompt to read:
:: "xplinux557@bash-pc:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$"
prompt=%USERNAME%@%USERDOMAIN%:%upath2% $$
::EOF
すべてが書かれている行を除いて、完全に正常に動作します
set upath2=%cd:%unixhome%="~"%
「〜」=%および%変数として%を、私にエラーメッセージが表示されます:私はそれを台無しにし、%CDを認識することを実現します。私はこの:)のようにして上のとりとめのために非常に残念本当にだけど、変数Bで見つかった場合には、長い話短い、変数Aのテキストを取り、そのテキストを置換する方法はありますか?
すべて事前にありがとうございます!
解決
タグで遅延拡張をオンにします
setlocal enabledelayedexpansion
と使用
set upath2=!cd:%userprofile%=~!
setlocal
は、新しい変数のスコープとそれの外側を保持されませんその範囲内で行わ環境変数への変更を開始することに注意してください。
あなたが、しかし、一回限りの使用のために次の操作を行うことができます:
setlocal enabledelayedexpansion
set upath2=!cd:%userprofile%=~!
endlocal&set upath2=%upath2%
他のヒント
あなたはCALL SET
を使用して "evalの" を行うことができます
:: This does not work: set upath2=%cd:%unixhome%=~%
:: This works:
:::: uhome is the homepath, with unix-style (forward) slashes
set uhome=%HOMEPATH:\=/%
:::: ucwd is the current working directory, with unix-style (forward) slashes
set ucwd=%cd:\=/%
:: replace any occurence of uhome in ucwd with ~
CALL SET ucwd=%%ucwd:%uhome%=~%%
:: strip drive letter and colon
set ucwd=%ucwd:~2%
:: set prompt
prompt=%USERNAME%@%USERDOMAIN%:%ucwd% $$
私はこれを呼び出すとI GET User@Machine:~/Documents/dev/batch
PS:私はあなたがバグを持っていたと思います。あなたは%cd:...
を望んでいません。あなたはスラッシュで変数を望んでます。
も:これは、堅実な信頼性があることを行っていません。
:あなたはこのようなディレクトリ構造を持っている場合を考えてみましょう c:\Users\John\Other
c:\Users\John\Other\Users
c:\Users\John\Other\Users\John
c:\Users\John\Other\Users\John\data
...この場合には、あなたは2 twiddlesを取得します。