我正在尝试对所有文件执行替换字符串操作,除了 .git 文件夹中的文件和所有可以嵌套在任何嵌套目录中的pycache目录。我正在包含 .git 文件夹的根目录中执行脚本。
for /r /d %%F in (*) do (
echo Checking: %%F
if not "%%~xF"==".sh" if not "%%~xF"==".png" if not "%%~xF"==".bat" if not "%%~dpF"=="__pycache__\" if not "%%~dpF"==".git\" (
echo Found file: %%F
findstr /C:"{{ADDON_NAME_PACKAGE}} {{ADDON_NAME}} {{ADDON_NAME_FULL}}" "%%F" >nul 2>&1
if not errorlevel 1 (
echo %%F
set "file=%%F"
setlocal DisableDelayedExpansion
set "cmd=sed -i -e ""s/%replace_package%/%package_name%/g"" -e ""s/%replace_addon_name%/%addon_short_name%/g"" -e ""s/%replace_addon_name_full%/%addon_full_name%/g"" ""!file!""
endlocal & !cmd!
echo Replaced placeholders in !file!
)
)
)
但我陷入了这个循环的if条件,它仍然打印出 .git 文件夹中的所有文件,即使它被排除在外if not "%%~dpF"==".git\"
。为什么?我找不到任何解决方案,甚至聊天 gpt 也不能告诉我。AI怎么可能不知道这一点?也if not "%%~dpF"=="%CD%\.git\"
不起作用。
for /r /d %%F in (*) do (
echo Checking: %%F
if not "%%~xF"==".sh" if not "%%~xF"==".png" if not "%%~xF"==".bat" if not "%%~dpF"=="__pycache__\" if not "%%~dpF"==".git\" (
echo Found file: %%F
它仍然打印 .git 文件夹和 __pycache__ 文件夹中的文件。使用 Unix/Linux 很容易实现这一点
replace_package="{{ADDON_NAME_PACKAGE}}"
replace_addon_name="{{ADDON_NAME}}"
replace_addon_name_full="{{ADDON_NAME_FULL}}"
perform_replacements() {
local file="$1"
local package_name="$2"
local addon_short_name="$3"
local addon_full_name="$4"
sed -i "s/${replace_package}/${package_name}/g; s/${replace_addon_name}/${addon_short_name}/g; s/${replace_addon_name_full}/${addon_full_name}/g" "$file"
}
find . \( -name .git -o -name __pycache__ \) -prune -o \( -type f -not -name "*.sh" -not -name "*.png" \) -print0 | while IFS= read -r -d '' file; do
perform_replacements "$file" "$package_name" "$addon_short_name" "$addon_full_name"
echo "Replaced placeholders in $file"
done
所以我不明白为什么在 Windows .bat 文件上做同样的事情如此复杂?是什么赋予了?
这不是完整的答案。仅是使用 PowerShell 的示例。
将其保存到扩展名为
.ps1
. 例如:test.ps1
,并将其放在您的工作目录中。要执行,Right Click
>Run with PowerShell
。这将显示除过滤器之外的所有文件和目录
$WL1
$WL2
$WL1
您可以添加要通过其扩展名(在 中)和名称(在 中)排除的文件或文件夹$WL2
。要检查所有可用的筛选器,您可以在目录中的 PowerShell 控制台中键入
Get-ChildItem -Recurse | Get-Member
或。GCI -R|GM
虽然 PowerShell 脚本比普通批处理脚本更容易编写和阅读,但它们缺少一件事:普通用户很难执行它们,因为你不能双击它们。
不过,有一些简单的解决方案,其中两个最常见的解决方案是:
简单的一个
像平常一样编写 PowerShell 脚本。然后创建一个 cmd 脚本,将
powershell.exe -ExecutionPolicy Bypass -NoProfile -NoLogo -File "%~dp0\MyPowerShellFile.ps1
. 现在,您可以向用户提供这两个文件,他们只需按照习惯双击 bat 文件,它就会执行 powershell 脚本。这使用户(和您自己)可以轻松使用批处理文件,同时获得 PowerShell 的所有功能。缺点是您现在有两个文件,这使我们:
仅一个文件
与上一个类似,但您也可以将整个脚本集成到批处理文件中,而不是调用单独的文件,从而避免需要两个文件。
您可以通过使用参数
-EncodedCommand
将 base64 编码的字符串传递给 PowerShell 来完成此操作,该字符串将包含整个脚本。一个简单的 PowerShell 函数(在 cmd 中编写等效代码很有趣。),它接受任何 PS1 文件并创建一个 bat 文件,如下所示:
来源,因为我手头没有我的脚本集 - 但看起来不错。