.bat上的%userprofile%无效

时间:2018-06-05 02:42:27

标签: batch-file

.bat中的我的脚本如下:

@echo off
mode 34,18
color f0
start /min "" "%userprofile%\Arquivos Extratos"&start CieloTan.iim"
echo.
echo.
echo Extraindo os Extratos...
echo Aguarde...
echo.
echo.
timeout /nobreak /t 300 >nul 2>nul
cls
echo.
echo.
echo Ajustando Arquivo de texto...
echo Aguarde...
echo.
echo.
ren "%userprofile%\Documents\iMacros\Downloads\extract.csv" "extract.txt" >nul 2>nul
move "%userprofile%\Documents\iMacros\Downloads\extract.txt" "%userprofile%\Arquivos Extratos\extract.txt" >nul 2>nul
set "$file=extract.txt"
set "$search=Previsto"
set $repl[2]=TOTAL         
set $repl[3]=Visa            
set $repl[4]=Mastercard  
set $repl[5]=Amex          
set $repl[6]=Sorocred     
set $repl[7]=Elo              
set $repl[8]=Diners         
set $repl[9]=Agiplan       
set $repl[10]=Banescard   
set $repl[11]=Cabal          
set $repl[12]=Credsystem 
set $repl[13]=Hipercard   
set $repl[14]=Credz         
set $repl[15]=Hiper          
setlocal enabledelayedexpansion
set $count=1
(for /f "delims=" %%a in (%$file%) do (
   call:replace "%%a" !$count!
   set/a $count+=1
   )
)> "Futuros Cielo Tan.txt"
echo. >> "Futuros Cielo Tan.txt"
echo ---  FUTUROS CIELO TAN --- >> "Futuros Cielo Tan.txt"
del extract.txt
mkdir "c:\Users\%username%\Desktop\Extratos Banco"
move "Futuros Cielo Tan.txt" "c:\Users\%username%\Desktop\Extratos Banco"
exit/b
:replace
set "$line=%~1"
set $repl=!$repl[%2]!
set "$line=!$line:%$search%=%$repl%!"
echo !$line!
if "%2"=="1" echo.
if "%2"=="2" echo.

但是代码的以下部分存在错误:

mkdir "c:\Users\%username%\Desktop\Extratos Banco"
move "Futuros Cielo Tan.txt" "c:\Users\%username%\Desktop\Extratos Banco"

当脚本运行时,它正在创建一个名为" Desktop \ Extratos Bancos"的文件夹。 in" C:\ Users"。它无法识别我当前的用户名。有人能帮助我吗?

见下图,它创建了directoy:

Directory tree

1 个答案:

答案 0 :(得分:1)

与您的标题相反,它是username,而非userprofile似乎是问题的根源。

通常情况下,操作系统会设置这两个变量(以及其他变量),并且它们被视为糟糕的编程习惯,以改变其内容。

我怀疑之前的批次已经改变username - 这对于没有经验的游戏者来说是一个有吸引力且有意义的变量名。

缺乏经验的另一个迹象是在setlocal之后没有@echo off命令。虽然这不是强制,但它确保批处理结束时批处理对环境所做的更改将被丢弃,因此它们不会随着连续的批处理运行而累积。

因此我在启动此批次时检查username是否为空,所以可能添加

echo username=%username%
if not defined username echo no username&pause&goto :eof

@echo off之后发出警告并中止。

在脚本的其他地方,使用了userprofile。我无法看到有问题的行更改为c:\users\%username%的任何原因,因为通常%userprofile%相同。

发布相关细节后:

@ECHO OFF
SETLOCAL
SET "user_name=!M D!"
SET "destdir=U:\destdir"
SETLOCAL ENABLEDELAYEDEXPANSION
DIR /ad "%destdir%"
ECHO ---------------------------------
MD "%destdir%\%user_name%\Banquo's ghost"
DIR /ad "%destdir%"
ECHO ---------------------------------
SETLOCAL DISABLEDELAYEDEXPANSION
MD "%destdir%\%user_name%\Banquo's ghost"
DIR /ad "%destdir%"
ECHO ---------------------------------

GOTO :EOF

问题是您的用户名是!M D!,并且您已调用delayedexpansion,因此批量替换变量username的值(我使用user_name因为我没有因此,更改系统设置变量)...!M D!...,然后替换M D的值。

以上演示重复您的情况,报告当前创建目录的尝试,然后解决问题 - 关闭delayedexpansion