批量复制并在新位置重新打开自身



我的批处理脚本无法从网络源运行,这就是为什么它将自己复制到桌面并启动新副本,完成后它会删除副本。

:: Check location
if "%~dp0" == "%userprofile%Desktop" goto:eof
xcopy /I /Y "%~dpnx0" "%userprofile%Desktop" >nul 2>&1
start "new window" cmd /c %userprofile%Desktopbatchname.bat
exit

这工作正常,我的问题是,%cd% 或 %0 没有更新,仍然像原始脚本一样运行。显示原始脚本的位置。

如何检查位置,自行复制到桌面并启动它,就像在窗口中双击它一样?因为脚本只有在通过共享的原始脚本启动时才会失败。

发生什么:

  • 从网络共享启动脚本 XYZ.bat
  • 脚本通知不在桌面上
  • 脚本自行复制到桌面
  • 脚本运行从桌面复制
  • 脚本结束

  • 从原始脚本启动的副本

  • 位于桌面上的脚本>>很好
  • 脚本
  • 读取脚本标头的信息:

    for /F "tokens=3-8 delims= " %%a in ('findstr /B /C:":: Drive:" "%~dpnx0"') do (

  • 脚本
  • 失败,因为 %~dpnx0 包含原始脚本的路径,该路径不可用,因为此时删除了所有网络共享

有什么建议吗? PS:我是新来的,希望我的英语可以理解。干杯


编辑:感谢您的帮助,路径问题现已修复,脚本工作正常,只要我不打开"删除所有现有驱动器"功能。如果我这样做,会发生以下情况:

以前采取的步骤: 脚本检查位置并将自身复制到用户桌面并从那里开始,所有驱动器也被删除,然后它在 findstr 上失败并出现错误:

  • [驱动器映射器:] 已删除所有映射驱动器
  • [驱动器映射器:] 现在映射驱动器:
  • Das aktuelle Verzeichnis ist ungültig.当前 文件夹不存在
  • [驱动器映射器:] 成功完成<<</strong>
  • 我希望..
  • Drücken Sie eine beliebige Taste . . .按任意键继续

映射功能:

:mapdrives
%say% Mapping drives now:
set errorcount=0
for /F "tokens=3-8 delims=  " %%a in ('findstr /B /L /C:":: Drive:" "%~f0"') do (
REM echo Server=%%a User=%%b Letter=%%c drive=%%d nick=%%e
REM if "%%b" == "all" OR if "%%b" == "%username%" (
if "%%b" == "all" (
>nul 2>&1 net use %%c: \%%a%%d /persistent:yes
if errorlevel 1 (%say2% Failed %%c: \%%a%%d & set /a errorcount=errorcount+1) else (
if "%%e" == "" (
:: Rename without nick
>nul 2>&1 reg add HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerMountPoints2##%%a#%%d /v _LabelFromReg /d "%%d (%%a)" /f
%say2% Successfully %%c: \%%a%%d
) else (
:: Rename with nick
>nul 2>&1 reg add HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerMountPoints2##%%a#%%d /v _LabelFromReg /d "%%e (%%a)" /f
%say2% Successfully %%c: \%%a%%d @ %%e
)
)
)
if "%%b" == "%username%" (
>nul 2>&1 net use %%c: \%%a%%d /persistent:yes
if errorlevel 1 (%say2% Failed %%c: \%%a%%d & set /a errorcount=errorcount+1) else (
if "%%e" == "" (
:: Rename without nick
>nul 2>&1 reg add HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerMountPoints2##%%a#%%d /v _LabelFromReg /d "%%d (%%a)" /f
%say2% Successfully %%c: \%%a%%d
) else (
:: Rename with nick
>nul 2>&1 reg add HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerMountPoints2##%%a#%%d /v _LabelFromReg /d "%%e (%%a)" /f
%say2% Successfully %%c: \%%a%%d @ %%e
)
)
)
%sf_wait2%
)
%sf_wait%
if "%errorcount%" == "0" (%say% Successfully finished) else (%say% Warning %errorcount% Errors!!)
%say2% & pause
goto:eof

从批处理标头编写螃蟹信息:

:: - Force - Deleting drives        (0=No,1=Yes)
set force_del_drives=1
:: - Force - Kill Explorer          (0=No,1=Yes)
set force_kill_explorer=1
::----------------------------------------------------------------------------------------
:: HINT     SERVER      USER    LETER   DRIVE       NICKNAME (IF NOT USING DRIVENAME)
::  Drive:  server  all     H       Home        My Home
::  Drive:  server  all     V       Drive1
::  Drive:  server  all     M       Drive2
::----------------------------------------------------------------------------------------
::  -Drive: server  user    I       DisabledDrive
::  Drive:  server  user    K       Drive4
::  Drive:  server  user    Z       Homes       All Homes

PS:如果我从c:\运行脚本,它会将自己复制到桌面并完美运行,如果我不删除执行原始脚本的网络驱动器,它也像我说的那样工作。

有什么想法吗?

@echo off
setlocal
:: Check location
if not exist "%userprofile%Desktop" (
>&2 echo Desktop folder not exist
exit /b 1
)
if "%~dp0" == "%userprofile%Desktop" goto :main
xcopy /I /Y "%~f0" "%userprofile%Desktop" >nul 2>&1
start "new window" "cmd /c "%userprofile%Desktop%~nx0""
goto :eof
:main
echo %~f0
pause
goto :eof

添加了对桌面文件夹的检查,因为它是Shell 文件夹,可能 该位置不存在。

逻辑更改为转到:主标签(如果位置为桌面文件夹)。

修改start命令以处理脚本名称和扩展名 无需硬编码名称和扩展名。

相关内容

  • 没有找到相关文章

最新更新