4

バッチスクリプトで置き換えようとして~います。%HOME%これは私がこれまでに持っているものです:

@echo off
setlocal enabledelayedexpansion
set str=%*
set replacement=%HOME%
set str=%str:~=!replacement!%
echo %str%

~おそらく何らかの方法でチルダをエスケープする必要があるため、これは期待どおりに機能しません。

でエスケープすると^strは変化しません。エスケープなしstrの文字列はstr:~=<my_home_path>.

"~/work/my_folder"に変更するにはどうすればよい"C:/Users/login/work/my_folder"ですか?

4

4 に答える 4

3

が常に最初の文字である場合~は、次のように使用できます。

@echo off &setlocal enabledelayedexpansion
set "str=|~/work/my_folder"
set "replacement=C:/Users/login"
set str=%str:|~=!replacement!%
echo %str%
于 2013-03-11T08:54:55.507 に答える
3

またはもう少し複雑です:

@echo off &setlocal enabledelayedexpansion
set "str=~/work/my_folder -param one ~ two:~"
set "replacement=C:/Users/login"
call :strlen str len
set /a len-=1
for /l %%i in (0,1,%len%) do if "!str:~%%i,1!"=="~" (set "new=!new!%replacement%") else set "new=!new!!str:~%%i,1!"
echo %new%
goto :eof

:strlen
:: list string length up to 8189 (and reports 8189 for any string longer than 8189)
:: function from http://ss64.org/viewtopic.php?pid=6478#p6478
(   setlocal enabledelayedexpansion & set /a "}=0"
    if "%~1" neq "" if defined %~1 (
        for %%# in (4096 2048 1024 512 256 128 64 32 16) do (
            if "!%~1:~%%#,1!" neq "" set "%~1=!%~1:~%%#!" & set /a "}+=%%#"
        )
        set "%~1=!%~1!0FEDCBA9876543211" & set /a "}+=0x!%~1:~32,1!!%~1:~16,1!"
    )
)
endlocal & set /a "%~2=%}%" & exit /b
endlocal

出力:

C:/Users/login/work/my_folder -param one C:/Users/login two:C:/Users/login

これは感嘆符では機能しません。

于 2013-03-11T10:35:49.893 に答える
1

いくつかの小さな問題を除いて、あなたはすでにかなり近づいていると思います。

まず、Windowsにはおそらく環境変数があり%home%ません-少なくとも私のシステムにはありません。あなたが探している変数は だと思います%userprofile%。ss64.com には、Windows 環境変数の優れたリストと説明があります。

もう 1 つの問題は、展開を間違った順序で遅らせていることです。最後から 2 番目の行を に変更しset str=!str:~=%userprofile%!て、内側の変数が外側の変数の前に展開されるようにしてください。スラッシュを後方に変換することも悪い考えではないかもしれません。

@echo off
setlocal enabledelayedexpansion
set str=%*
set "str=!str: ~= %userprofile%!"
set "str=!str:*~=%userprofile%!"
set "str=%str:\=/%"
echo %str%

出力例:

C:\Users\me\Desktop>test ~/.bash_profile
C:/Users/me/.bash_profile

C:\Users\me\Desktop>test arg1 arg2 ~/.bash_profile
arg1 arg2 C:/Users/me/.bash_profile
于 2013-03-11T11:58:35.517 に答える
0
    @ECHO OFF
    CLS
    SET OldStr=~\work\my_folder
    SET NewStr=
    SET Replacement=C:\Users\login\work\my_folder
    CALL :ReplaceHome "%OldStr%"
    ECHO %NewStr%
    EXIT /b %ERRORLEVEL%

    :ReplaceHome
    IF "%~1"=="" EXIT /B %ERRORLEVEL%
    SET TempStr=%~1
    IF "%TempStr:~0,1%"=="~" SET TempStr=%Replacement%%TempStr:~1%
    SET NewStr=%NewStr%%TempStr:~0,1%
    CALL :ReplaceHome "%TempStr:~1%"
    EXIT /B %ERRORLEVEL%
于 2017-09-05T21:31:55.057 に答える