我想在 -h 選項后獲取路徑。是否有一些命令對這種情況有幫助?
輸入(在我的情況下實際上是以下命令的輸出 - wmic process where "name like '%%w3wp%%'" get processid,commandline):
c:\windows\system32\inetsrv\w3wp.exe -ap "SharePoint Central Administration v4" -v "v4.0" -l "webengine4.dll" -a \\.\pipe\iisipm23e2eb4d-e657-4192-980c-9ac9147d2f75 -h "C:\inetpub\temp\apppools\SharePoint Central Administration v4\SharePoint Central Administration v4.config" -w "" -m 0 5144
期望的輸出:
"C:\inetpub\temp\apppools\SharePoint Central Administration v4\SharePoint Central Administration v4.config"
uj5u.com熱心網友回復:
由于目標命令列不包含通配符 *和?以及<和>,下面的方法應該這樣做:
- 首先,環繞一個
for /F回圈來捕獲輸出wmic(沒有,ProcessID因為它無論如何都沒有使用,并且使用選項/VALUE來避免尾隨空格),然后嵌套另一個for /F再次處理該文本字串(這是正確處理 Unicode 輸出所必需的)的wmic)。 - 然后使用標準
for回圈遍歷命令列的部分/引數,檢查-h并檢索后續(帶引號或不帶引號)的專案。 - 最終跳過剩余的命令列部分。
這是一個可能的(未經測驗的)實作:
@echo off
rem // Capture the output of `wmic` using two `for /F` loops for proper Unicode-to-ASCII/ANSI conversion:
for /F "delims=" %%I in ('
wmic Process where "Name like '%%w3wp%%'" get CommandLine /VALUE
') do for /F "tokens=1* delims==" %%J in ("%%I") do (
rem // Reset flag, iterate through the parts of the retrieved command line:
set "FLAG=" & for %%L in (%%K) do (
rem // Check against option string `-h` (remove `/I` to become case-sensitive):
if /I "%%~K"=="-h" (
rem // Set a flag to indicate that next item is the target path:
set "FLAG=#"
) else if defined FLAG (
rem // Flag is set, hence extract unquoted target path and terminate loop:
set "TARGET=%%~K"
goto :NEXT
)
)
)
:NEXT
echo Extracted path: "%TARGET%"
uj5u.com熱心網友回復:
假設此命令列在變數中input:
這適用于命令列,以測驗該方法:
for /f delims^=^"^ tokens^=1 %a in ('echo %input:*-h =%') do @echo %a
這是您的批處理檔案代碼(讀取%input%并保存到%result%):
for /f delims^=^"^ tokens^=1 %%a in ('echo %input:*-h =%') do @set result=%%a
echo %result%
這是通過首先剪切所有內容直到-h 變數字串替換運算式中的所有內容,然后for /f與"作為分隔符一起使用來實作的。為了能夠指定"as 分隔符,我們不能delims=... tokens=...像通常那樣用引號將部分括起來,而是必須用^.
注意:這假設路徑將始終在命令列中參考。如果不是,您需要首先檢查切割左側后的部分是否以引號開頭,然后相應地使用引號或空格作為分隔符:
set x=%input:*-h =%
if ^%x:~0,1% equ ^" (
for /f delims^=^"^ tokens^=1 %%a in ('echo %x%') do @set result=%%a
) else (
for /f tokens^=1 %%a in ('echo %x%') do @set result=%%a
)
echo %result%
...但是不得不認真地訴諸這種難以理解的詭計,這讓我想知道為此使用具有數十年歷史的批處理檔案是否有意義。您是否考慮過使用 PowerShell 或 Python 或其他一些合適的腳本語言?
uj5u.com熱心網友回復:
此方法假定所需的字串以引號和空格結尾(在本例中,在-wswitch之前)。
@echo off
setlocal
set "input=c:\windows\system32\inetsrv\w3wp.exe -ap "SharePoint Central Administration v4" -v "v4.0" -l "webengine4.dll" -a \\.\pipe\iisipm23e2eb4d-e657-4192-980c-9ac9147d2f75 -h "C:\inetpub\temp\apppools\SharePoint Central Administration v4\SharePoint Central Administration v4.config" -w "" -m 0 5144"
set "x=%input:-h =" & set "part=%"
set "output=%part:" =" & REM %"
echo %output%
您可以閱讀有關此或此答案中使用的方法的進一步說明...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312627.html
上一篇:如何在這個混合的cmd/powershell代碼中轉義毒字符?
下一篇:洗掉Loop最后一個值上的逗號
