如何以如下格式导出为 CSV 日期时间;主机名;用户名 1;用户名 2; [关闭]
Posted
技术标签:
【中文标题】如何以如下格式导出为 CSV 日期时间;主机名;用户名 1;用户名 2; [关闭]【英文标题】:How to export to CSV in format like this datetime;hostname;username1;username2; [closed] 【发布时间】:2022-01-15 02:51:49 【问题描述】:请帮助我将某些内容解析为 CSV。我已经知道如何使用 Powershell 了,但我需要使用批处理文件。
我需要得到这样的输出:
datetime;hostname;username1;username2;
其中username1
username2
等是本地管理员组中的用户名。
我做了这个:
@echo off
echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%
for /f "tokens=* skip=6" %%a in ('net localgroup Administrators') do (
echo %%a >> "c:\temp\%datetimef%.csv")
pause
但是输出文件名是:
2021_ 1_Fr__11_42_18.csv
返回的日期是:
Administrator
Usr1
The command completed successfully
如何从生成的输出文件中删除The command completed successfully
?
【问题讨论】:
noo 因为我需要批量进行 作为旁注,flamixx%COMPUTERNAME%
不一定会扩展为与分配给“主机名”的字符串相同的字符串。
【参考方案1】:
您报告的输出的主要问题是,它似乎假定了您的 %DATE%
和 %TIME%
变量的返回输出。这些值可以针对区域设置、机器和/或登录用户进行不同的配置,并且在您的情况下与dd#MM#yyyy
的%DATE%
假设不匹配(其中#
代表项目分隔符)。你的显然是ddd d#M#yyyy
、ddd dd#MM#yyyy
、ddd M#d#yyyy
。或ddd MM#dd#yyyy
此站点上已有许多问题和答案,其中显示了使用非区域设置或其他配置格式获取日期和时间的方法,最有用的非 PowerShell 方法使用内置的 WMIC.exe 实用程序。
只是有点不同,即根本不使用 net.exe,而是使用 WMIC.exe:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "="
Set "="
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get CSName^,LocalDateTime /Format:MOF 2^>NUL') Do If Not Defined (Set "=%%G") Else (SetLocal EnableDelayedExpansion
Set "=%%G"
For %%H In ("!:~,4!_!:~4,2!_!:~6,2!__!:~8,2!_!:~10,2!_!:~12,2!;!!") Do (EndLocal
Set "=%%~H"))
For /F "Tokens=1,* Delims==" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Group Where "Name='Administrators'" Assoc:List /ResultClass:Win32_UserAccount 2^>NUL ^| %SystemRoot%\System32\findstr.exe "^Name="') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Defined (Set "=%%I") Else (SetLocal EnableDelayedExpansion
For %%J In ("!!") Do (Endlocal
Set "=%%~J;%%I"))
Set "CSVBaseName=%:;="&:"%"
(Echo %%;%%;) 1>"C:\Temp\%CSVBaseName%.csv"
如果您仍想使用 net.exe,即“有点不同”不是您想要的,那么以下应该执行相同的任务:
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "="
Set "="
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\net.exe LocalGroup
Administrators 2^>NUL') Do (If Not Defined (Set "=%%G") Else (
SetLocal EnableDelayedExpansion
For /F Delims^= %%H In ("!!") Do (EndLocal
Set "=%%H;%%G"
Set "=%%H"))
Set /P "=%%G" 0<NUL | %SystemRoot%\System32\findstr.exe "^\-\-*$" 1>NUL && (
Set "="))
If Not Defined GoTo :EOF
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\HOSTNAME.EXE'
) Do Set "=%%G;%%"
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get
LocalDateTime /Format:MOF 2^>NUL') Do Set "=%%~nG"
Set "=%:~,4%_%:~4,2%_%:~6,2%__%:~8,2%_%:~10,2%_%:~-2%"
(Echo %%;%%;) 1>"C:\Temp\%%.csv"
与此的不同之处在于,它不假定要跳过特定数量的行,它不期望最终用户语言是英语,它使用报告的主机名,而不是计算机名,(这可能不一定匹配),并且再次不依赖最终用户的计算机配置来定义日期和时间字符串。
【讨论】:
这不是“有点不同”,这是一种使另一个工作更简单的答案复杂化的令人困惑的方式。你没有帮助或让任何人通过这个学习一些东西...... 无论如何,我当然明白,这回答你自己,如果你以后需要编辑它,打开一个新问题会更容易......,我明白这里的方式是教人们解决自己的问题,而不是完全创造/改变它们.. 这与工作与否无关,也与限制无关,如果是的话,编辑子字符串变量以在必要时进行调整会更容易。但是请理解,对您的答案进行任何编辑,其中字符汤、转义和倍数for
,对于比您想象的更多的用户来说,它会变得复杂 100 倍,但它仍然有效。
当然是关于“工作”@Io-oI!正如您所说,我的代码有效,并且与 OP 的“答案”内容以及 Gerhard 提供的内容不同,它不限于最终用户的语言、日期和时间设置,也不假设要跳过的预设行数.由于这是一个国际网站,因此不限于语言或区域设置的答案比您认为的更有用。
两者都有效,但如果没有您的国际参与,则无法在必要时编辑您的。更改有效的方法(必要时进行一些简单的编辑),因此“国际有效”要复杂 100 倍,【参考方案2】:
在cmd
运行的.bat batch-file
中很容易做到这一点。如果您使用的是受支持的 Windows 系统,则可以使用 PowerShell。
powershell.exe -NoLogo -NoProfile -Command ^
$DatetimeF = Get-Date -Format 'yyyy_MM_ddThh_mm_ss'; ^
$Users = (Get-LocalGroupMember -Name Administrators).Name; ^
$DatetimeF + ';' + $Env:COMPUTERNAME + ';' + ($Users -join ';') ^| ^
Out-File -FilePath ($DatetimeF + '.csv')
【讨论】:
【参考方案3】:谢谢大家!最后我在你的帮助下解决了这个问题:
@echo off
setlocal enabledelayedexpansion
rem set mydate=%:/date:/=%
rem set mytime=%time::=%
rem set mytimestamp=%mydate: =_%_%mytime:.=_%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
set mytimestamp=%mydate%_%mytime%
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do (
set param=!param!%%a;)
echo %mytimestamp%;%computername%;!param! >> "c:\temp\%mydate%.csv"
【讨论】:
您不能随意发布答案,这不是它的工作方式,请按照您在网站上注册时应该阅读的内容重新阅读。【参考方案4】:我想你想要这样的东西?
@echo off
setlocal enabledelayedexpansion
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
set "var=%datetimef%"
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do set "var=!var!;%%a"
(echo %var%)>>"c:\temp\%datetimef%.csv"
【讨论】:
以上是关于如何以如下格式导出为 CSV 日期时间;主机名;用户名 1;用户名 2; [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter - 使用日期格式将表记录导出为 CSV