Batch file (&x27;findstr/b";URL=";%1";&x27;)不使用&xF6äü;在路径或文件名中

Batch file (&x27;findstr/b";URL=";%1";&x27;)不使用&xF6äü;在路径或文件名中,batch-file,for-loop,findstr,Batch File,For Loop,Findstr,我想在文件中搜索“URL=”。由于我在这方面很在行,所以我从stackoverflow收集了一些代码片段,…;-) 我的问题: 如果文件或路径在路径或文件名中包含德语“ö/ä/ü”或来自外语的字母/符号 D:\...\fähren 他被这样对待 D:\...\f"hren findstr说“无法打开文件”。这是我球棒的一部分 rem %cmdcmdline% ... :file rem url from .url file - im file steht URL=http....

我想在文件中搜索“URL=”。由于我在这方面很在行,所以我从stackoverflow收集了一些代码片段,…;-)

我的问题: 如果文件或路径在路径或文件名中包含德语“ö/ä/ü”或来自外语的字母/符号

D:\...\fähren
他被这样对待

D:\...\f"hren
findstr说“无法打开文件”。这是我球棒的一部分

rem %cmdcmdline%
...
:file   rem url from .url file  - im file steht URL=http.... .htm
for /f "delims=" %%a in ('findstr /b "URL=" "%~1"') do set URL="%%a"
echo. %URL% | FIND /I "URL=">Nul || (set URL=""&goto startit)

rem delete all until URL
set URL="%URL:*URL=%
rem delete =
set URL="%URL:~2%
.bat是从窗口内调用的,如下所示

HKEY_CLASSES_ROOT\InternetShortcut\shell\chrome\command "D:\sources\chrome\portable\chrome\chrome.exe" "%1"
.bat开头的rem%cmdline%看起来正常

D:\4all\reisen\istanbul\verkehr\fähren>rem C:\Windows\system32\cmd.exe /c ""C:\Users\gigoelri\AppData\Local\Temp\333A.tmp\chrome_pause.bat" D:\sources\chrome\portable\chrome\chrome.exe D:\4all\reisen\istanbul\verkehr\fähren\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url "
for循环的输出如下所示:

D:\4all\reisen\istanbul\verkehr\fähren>for /F "delims=" %a in ('findstr /b "URL=" "D:\4all\reisen\istanbul\verkehr\fähren\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url"') do set URL="%a"
FINDSTR: D:\4all\reisen\istanbul\verkehr\f"hren\Bosp_emin"n?_2h_14h30_12tl_SehirHatlari.url kann nicht geöffnet werden.(cannot be opened)

D:\4all\reisen\istanbul\verkehr\fähren>echo.    | FIND /I "URL="  1>Nul  || (set URL=""  & goto startit )
my cmd窗口的代码页:

D:\sources\firefox\_install>chcp
Aktive Codepage: 850.
Mofi 4:尝试mofis方法4-结果:找不到文件

rem C:\Windows\system32\cmd.exe /c ""C:\Users\gigoelri\AppData\Local\Temp\F54D.tmp\firefox_pause.bat" D:\sources\firefox\portable\firefox\firefox.exe D:\4all\reisen\istanbul\verkehr\fähren\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url "
...
D:\4all\reisen\istanbul\verkehr\fähren>for /F "usebackq tokens=1* delims==" %a in ("D:\4all\reisen\istanbul\verkehr\fähren\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url") do (if /I "%a" == "URL" (
set "URL=%b"
 goto startit
) )
Die Datei "D:\4all\reisen\istanbul\verkehr\fähren\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url" 
kann nicht gefunden werden.
这一次的原因似乎是文件名包含土耳其字母,如“Ş”,而不是“S”

编辑20150629:

系统为Windows7,驱动器D:NTFS

%~s1也不起作用:

D:\4all\reisen\istanbul\verkehr\fähren>for /F "usebackq tokens=1* delims==" %a in ("D:\4all\reisen\istanbul\verkehr\FHREN~1\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url") do (if /I "%a" == "URL" (
set "URL=%b"
 goto startit
) )
Die Datei "D:\4all\reisen\istanbul\verkehr\FHREN~1\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url" kann nicht gefunden werden.
Explorer文件名是:Bosp_eminönüu 2h_14h30_12tl_ŞehirHatları.url URL文件是通过从chrome中拖放以下URL创建的

%windir%\system32\cmd.exe dir命令显示: 末端的Ş和ı均未显示正常

而.exe似乎已经用错误的名称调用:

编辑20150630a:

我使用bat_到_Exe_转换器(x64.Exe)转换.bat。我这样做,例如,因为这样,注册表项可以保持不变,并且.exe可以被固定,而无需额外的努力

如果windows打电话,你是对的。一切正常

HKEY_CLASSES_ROOT\IE.AssocFile.URL\Shell\firefox\command
"D:\sources\firefox\_install\firefox.bat" "%1"
windows是否会根据调用的是.bat还是.exe而不同地传递参数?

@Mofi:感谢您的长期支持

这似乎不是“bat到exe转换器”的问题,因为: 请看第一行rem语句。它与编辑20150629下的.exe屏幕截图postet有很大不同。 还有一条附加语句“C:\Users\gigoelri\AppData\Local\Temp\F411.tmp\firefox\u pause.bat”、“”设置不同,并且URL在末尾拼写不同 …ı.url“”而不是…i.url“

1.关于引用分配给变量的值 一个非常常见的错误是使用:

set variable="value with spaces"
这会将
“带空格的值”
以及行尾的所有内容(如尾随空格)分配给
变量

第一个双引号的正确位置是:

set "variable=value with spaces"
这仅将带有空格的
值分配给
变量
,与此行的尾随空格或制表符无关

有关更多详细信息,请参阅上的我的回答

2.在for循环中完成分配的测试 对于在FOR循环中进行的赋值,这是一种比实际需要复杂得多的测试方法

更易于阅读且执行速度更快的是:

@echo off
set "URL="
for /F "delims=" %%a in ('%SystemRoot%\System32\findstr.exe /b "URL=" "%~1" 2^>nul') do set "URL=%%a"

if "%URL%"=="" goto Chrome

rem Remove URL= from string value.
set "URL=%URL:~4%"

echo URL found: %URL%
goto :EOF

:Chrome
echo No URL found.
删除
URL=
不区分大小写现在容易多了,因为双引号不是分配给变量
URL
的字符串值的一部分,因为它引用了分配给变量right的值

3.GUI和控制台窗口中的代码页 在德国国家,GUI上用于非Unicode字符串的代码页是

但在德国国家/地区默认使用控制台窗口

通过比较两个表可以看出,德国UMLAUT在这两个代码页中具有不同的字节值,这解释了您所看到的情况

通过打开命令提示符窗口并在其中运行不带任何参数的命令chcp,或不带任何参数的命令模式,可以查看控制台窗口中默认使用的代码页。在这两种情况下,使用的代码页都在控制台窗口中输出

Commandchcp表示更改代码页,因此可用于切换激活命令提示符的代码页

在批处理文件中必须执行的操作取决于作为参数传递给批处理文件的文件名字符串使用的编码


提问者提供有关如何调用批处理文件的附加信息后进行编辑。

4.不使用FINDSTR的方法 此任务不需要使用findstr。使用findstr只会使批处理文件变得比需要的更慢、更复杂

因此,我建议为该任务提供一个更简单的批处理解决方案:

@echo off
for /F "usebackq tokens=1* delims==" %%a in ("%~1") do (
    if /I "%%a"=="URL" (
        set "URL=%%b"
        goto FoundURL
    )
)
echo No URL found.
goto :EOF

:FoundURL
echo URL found: %URL%
*.url文件现在由命令行解释器使用for直接解析,而不是使用findstr

在命令提示窗口中运行以获取/?
,获取此命令的帮助信息

默认情况下,使用带有参数
/F
for时,将直接解析双引号中的字符串。但对于此任务,必须解析双引号中指定了完整路径的文件。因此,
usebackq
用于更改for字符串解析行为,以获取路径为双引号i的文件名解释为要分析的文件名

下一步,此批处理文件仅对以下行感兴趣:

URL=https://stackoverflow.com/
因此,
delims==
用于将每行拆分为字符串,并使用等号作为分隔符

想要的是第一个等号左边的字符串和第一个等号右边的所有内容,当然也可以包含一个或多个等号。通过
tokens=1*
,我们可以准确地得到拆分行为。第一个等号左边的字符串是token 1,它被分配给循环变量
a
,而第一个等号后面的所有内容都是符号是分配给循环变量
b
的标记2

将字符串左等号与字符串
URL
进行不区分大小写的比较,检查是否在文件中找到了感兴趣的行。在这种情况下,作为URL字符串的标记2被分配给环境变量
URL
,循环退出时跳转到标签,因为不需要
URL=https://stackoverflow.com/
D:\4all\reisen\istanbul\verkehr\fähren\Bosp_eminönü_2h_14h30_12tl_SehirHatlari.url