返回列表 发帖
回复 30# piazini
@echo off
set "PHP_INI_FILE=php.ini-dist"
set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
set "REPLACE_TEXT=cgi.fix_pathinfo=1"
(
for /f "delims=" %%i in ('findstr /n .* "%PHP_INI_FILE%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if /i "!line!" == "!SEARCH_TEXT!" (
echo(!REPLACE_TEXT!||/ ^)
) else (
echo(!line!||/ ^)
)
endlocal
)
)>"php.ini"
pause&exit/bCOPY

TOP

本帖最后由 aloha20200628 于 2025-1-29 20:12 编辑

回复 26# piazini

24楼报告结果表明用14楼代码处理20楼所附 'php-5.2.9-Win32.zip' 中的 php.ini-dist 文件(该文件是ansi编码,1284行,没有中文字符,仅在第520行出现被替换字段)已经顺利通过
处理结果是第520行被正确替换,且全文中的 ! 字符均得以保留(包括113、193、316、401、772、807行中的 ! 字符)因为14楼代码全程没有开启延迟变量,字符串包含的 ! 字符不会被转义求值...
楼主采用的全部测试代码中除了14楼代码还有其他前置代码吗?被测试的是这个 php-5.2.9-Win32.zip' 中的 php.ini-dist 文件吗

TOP

回复 27# piazini


   新年好!  代码前如果有其它代码 开启了延迟变量扩展,需关闭
@echo off
set "file=D:\php-5.2.9-Win32\php.ini-dist"
rem a对应b,不需要空格
set "#"a"=b"
set "#"cgi.fix_pathinfo"=1"
rem 替换为空值,则值为 / 在21行判断,如
set "#"c"=/"
(for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
if "%%b" neq "" (
for /f "delims==" %%c in (" %%b") do (
for /f "tokens=1* delims=; " %%d in ("%%c") do (
if defined #"%%d" (
if "%%e" equ "" (
for /f "tokens=* delims=; " %%f in (" %%b#") do (
for /f "tokens=1* delims==" %%g in ("%%f") do (
for /f "tokens=*" %%i in ("%%h") do (
set str=%%f
setlocal enabledelayedexpansion
if "!#"%%d"!" equ "/" (
echo=%%g=
) else (
call echo=!str:%%i=%%#"%%d"%%!
)
endlocal
set m_e=1
)
)
)
)
)
)
)
)
if defined m_e (
set m_e=
) else (
echo=%%b
)
)) > "out.txt"
rem move "out.txt" "%file%"
pauseCOPY
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2025-1-29 21:18 编辑

回复 26# piazini

再改用另一个方法替换处理 php.ini-dist 文件,楼主可试试以下代码,存为 test.bat 运行,与 php.ini-dist 文件同目录 ...
@echo off &endlocal &setlocal
set "PHP_INI_FILE=php.ini-dist"
set "SEARCH_TEXT=; cgi.fix_pathinfo=0"
set "REPLACE_TEXT=cgi.fix_pathinfo=1"
for /f "tokens=1 delims=:" %%a in ('findstr /n ".*" "%PHP_INI_FILE%"^|findstr /ic:"%SEARCH_TEXT%" ') do set "_#%%a=1"
(for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" %PHP_INI_FILE%') do (
    if defined _#%%a (echo,%REPLACE_TEXT%) else echo,%%b))>"php.ini"
pause&exit/bCOPY

TOP

本帖最后由 piazini 于 2025-1-29 21:31 编辑

回复 33# 77七


    我确实开启了延迟变量,但是遇到个问题,在if exist 前用endlocal关闭了延迟变量,但是"%INPUT_FILE_52_dev%" 为什么会成空值?
    我用%%包裹的变量也会收到影响?
   set "INPUT_FILE_52_dev=php.ini-dist"
   setlocal enabledelayedexpansion
    <略 去一些其他代码>
   endlocal
   @REM 获取配置文件
    set PHP_INI_FILE=
    if exist "%INPUT_FILE_52_dev%" (
        set PHP_INI_FILE="%INPUT_FILE_52_dev%"
    ) else if exist "%INPUT_FILE_dev%" (
        set PHP_INI_FILE="%INPUT_FILE_dev%"
    ) else (
        echo. & echo.
        echo [ Error ] 没有匹配的 dev 版 ini 配置文件:%PHP_INI_FILE% !!!
        echo. & echo. & pause & exit /b
    )COPY
输出结果:
[ Error ] 没有匹配的 dev 版 ini 配置文件: !!!COPY

TOP

回复  piazini

24楼报告结果表明用14楼代码处理20楼所附 'php-5.2.9-Win32.zip' 中的 php.ini-dist 文件 ...
aloha20200628 发表于 2025-1-29 19:04


33楼给了提示,可能和我开启延迟变量有关系。但是在没有用到叹号包裹的地方关闭延迟变量,%%包裹的变量会出现空值。

TOP

回复 35# piazini


   setlocal和endlocal之间设置的变量为区域变量
bat小白,请多指教!谢谢!

TOP

回复 37# 77七

是我描述的问题,变量设置不在延迟变量的范围。
35楼内容修改了,麻烦你再看看

TOP

回复 38# piazini


   如果用相对路径,检查下脚本的工作目录
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2025-1-29 22:29 编辑

回复 36# piazini

如果仅是解决一楼的问题,用14楼代码完全可以结帖了
但楼主 实际要解决的问题和实际采用的代码 并非完全如此,这就很容易把解答者带入 ‘迷阵’...

TOP

rem 另存为 ANSI 编码 bat
' & cls & cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit /b
PHP_INI_FILE = "php.ini-dist"
SEARCH_TEXT  = "; cgi.fix_pathinfo = 0"
REPLACE_TEXT = "cgi.fix_pathinfo = 1"
OUT_FILE     = "php.ini"
Set oStream = CreateObject("ADODB.Stream")
oStream.Type = 2
oStream.Mode = 3
oStream.Charset = "GBK"
oStream.Open()
oStream.LoadFromFile PHP_INI_FILE
s = oStream.ReadText()
oStream.Close()
m = Replace(SEARCH_TEXT, " ", "")
m = Replace(m, ".", "\.")
Pattern = "^"
If Left(m, 1) = ";" Then
    Pattern = Pattern & "; *"
    m = Right(m , Len(m) - 1)
End If
m = Split(m, "=")
Pattern = Pattern & m(0) & " *= *" & m(1)
Set oRegExp = CreateObject("VBScript.RegExp")
oRegExp.Global = True
oRegExp.MultiLine = True
oRegExp.IgnoreCase = True
oRegExp.Pattern = Pattern
If oRegExp.Test(s) Then s = oRegExp.Replace(s, REPLACE_TEXT)
oStream.Open()
oStream.WriteText s
oStream.SaveToFile OUT_FILE, 2
oStream.Close()COPY
不知道5楼的powershell楼主为什么不用,win7、win10、win11都是自带powershell.exe的,很方便

这个是批处理调用cscript.exe,也是winxp、win7、win10、win11自带的命令
这里做了兼容性处理
SEARCH_TEXT指定为以下几行都可以得到同样的结果
; cgi.fix_pathinfo = 0
;  cgi.fix_pathinfo  =  0
;cgi.fix_pathinfo=0
cgi.fix_pathinfo = 0

QQ 20147578

TOP

可还行
if exist 是使用变量的值判断文件 , 不是判断变量本身 , 变量是变量 , 文件是文件
执行 set file=win12.iso 并不会拥有win12的iso文件了 , 只会拥有值为win12.iso的变量

还是不行不如直接用记事本打开 , 然后查找替换

TOP

回复 39# 77七


    打印了目录,确实发现,路径不对,解决了,谢谢

TOP

回复 41# czjt1234


    新年好,非常感谢回复,目前打算用bat方式解决,而且也不想依赖第三方东西,这样在各版本系统中,都可以直接使用。

   目前编写bat系统是Win11 等写好后打算去 Win7 上验证一下

TOP

回复 40# aloha20200628


    是的,本来想把样本和源码打包上传附件的,方便大家看到来龙去脉,结果发现上传失败,可能是我的等级低。

    在排查过程中也发现我的问题,也发现 if 里的 %%b 有时候会没有值,有时候又有值,

    不明所以为什么会空值,然后在if前输出%%b后,if又好了能正常判断输出了

    现在不知道调的是不是和延迟变量有关系,输出文本里 所有的叹号又没了

    另,还想问一下,如果有多个替换的值,增做方便些,我能想到就是多加几个if这样判断

    有没有类似python的字典方式的放 查找字符:替换字符?

TOP

返回列表