【问题标题】:Generate GUID in Windows with batch file使用批处理文件在 Windows 中生成 GUID
【发布时间】:2010-11-30 11:54:54
【问题描述】:

如何在 Windows 中使用命令行运行的批处理文件中生成 GUID?

【问题讨论】:

  • 没有可用的内置命令可以做到这一点。要么自己写,要么得到一个现有的。
  • 顺便说一句,MS-DOS 已经死了至少 10 年。运行批处理文件的程序是命令提示符。
  • @Tim Robinson:感谢您的意见,期待有关创建 GUID 的帮助。

标签: batch-file command-line cmd guid


【解决方案1】:

Windows SDK 附带一个名为 uuidgen 的工具(如果您有 Visual Studio,您将拥有 Windows SDK,并且您需要运行 Visual Studio Command Prompt 来设置正确的路径)。

C:\>uuidgen

这将输出一个新的 GUID,例如

cc23b318-156e-473f-aa6e-517bf091a0f0

【讨论】:

  • 可以单独下载安装Windows SDK吗?虽然对于一个实用程序来说很多 - 编写自己的实用程序比等待下载要快。
  • 如果您没有其他选择,您可能需要编写自己的 GUID 生成器
  • 您需要在 uuidgen 上为 windows 安装程序项目文件使用 -c 选项。
  • 有趣的是,我有三个不同版本的 VS,但 uuidgen 不在我的 PATH 中。此外,它似乎不是真正随机的,而是基于时间的(这个实用程序的 Unix 版本有一个 -r-t 标志来指定你想要它是基​​于随机还是基于时间。
【解决方案2】:

如果你有 powershell 环境,试试这个。

FOR /F %a IN ('POWERSHELL -COMMAND "$([guid]::NewGuid().ToString())"') DO ( SET NEWGUID=%a )

然后准备来自%NEWGUID%的Guid值

【讨论】:

  • 如果编写批处理文件 (.bat),不要忘记在 FOR 语句中将 % 加倍(因此该行应为 FOR /F %%a IN ('POWERSHELL -COMMAND "$([guid]::NewGuid().ToString())"') DO ( SET NEWGUID=%%a )
  • @Soundararajan powershell 和 .NET 在 Vista 之后的所有 Windows 版本中都可用
【解决方案3】:

1.创建一个名为myuuid.vbs的文件,内容为

set obj = CreateObject("Scriptlet.TypeLib")  
WScript.StdOut.WriteLine Mid(obj.GUID, 2, 36)

2.goto 命令提示符

cscript //NoLogo myuuid.vbs

使用 JAVA 代码

    UUID uuid = UUID.randomUUID();
    String randomUUIDString = uuid.toString();

【讨论】:

  • @Pratik 这是 VB 脚本代码,可以完成您的任务,您不需要任何特殊的环境,只需遵循提到的 2 个步骤
  • @Pratik 您是否遵循了确切提到的第 2 步?从命令行它应该是“脚本//NoLogo myuuid.vbs”
  • @Pratik type "cscript //NoLogo myuuid.vbs"
  • @Pratik devguru.com/technologies/vbscript/quickref/… 这是如何使用 VBS 创建文件的示例,它已经存储在变量 OBJ 中,我不太了解 VBS,否则我会告诉你:)
  • 安装 cygwin,并确保你有 util-linux 包。这会给你一个uuidgen 命令。
【解决方案4】:

在powershell中很容易做到

[guid]::NewGuid()

【讨论】:

【解决方案5】:

没有可用的内置命令可以做到这一点。要么自己编写,要么获取现有的。

可以使用 C# 编写一个向控制台输出 GUID 的简单程序:

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine(System.Guid.NewGuid().ToString());
    }
}

将上面的 sn-p 放在文件名 guidgen.cs 中,然后使用以下命令行编译它(必须在您的系统上安装 .NET Framework 2.0):

%WINDIR%\Microsoft.NET\Framework\v2.0.50727\csc.exe guidgen.cs 

这将创建一个名为 guidgen.exe 的可执行文件。

【讨论】:

  • 看起来像 C#。好吧,我有一台没有 .NET 框架的非常旧的电脑,这会起作用吗?或者你有什么解决方案吗?
  • @Pratik:几岁?它真的在运行 MS-DOS 吗?你有任何可用的编译器吗?
  • DOS 版本 5.1.2600 在 Windows XP 上。我对编译器一无所知
  • 知道为什么我不能将 bash 中的 clip 输出设置为 $ guidgen | clip 吗?我必须将其包装在一个函数中并将其导出为guidgen() { echo "$(guidgen.exe)"; } export -f guidgen(请参阅stackoverflow.com/questions/1500499/…)。
  • ToString 调用不是必需的,因为 WriteLine 具有 System.Object 的重载,它的作用相同。不确定创建字符串实例是否比装箱性能更差,但它肯定更长且可读性更低。
【解决方案6】:

这会将新的 GUID 复制到剪贴板:

POWERSHELL -c "[guid]::NewGuid().ToString().ToUpper()" | CLIP

【讨论】:

    【解决方案7】:

    如果您想使用纯 cmd 命令执行此操作,您可以使用类似的东西(这不是真正的 GUID,但它可以根据您的上下文提供帮助):

    @call :GetGuid NewGuid
    @echo My new GUID : %NewGuid%
    
    @goto :eof
    
    
    :GetGuid
     @set _guid=%computername%%date%%time%
     @set _guid=%_guid:/=%
     @set _guid=%_guid:.=%
     @set _guid=%_guid: =%
     @set _guid=%_guid:,=%
     @set _guid=%_guid::=%
     @set _guid=%_guid:-=%
     @set %1=%_guid%
    @goto :eof
    

    【讨论】:

    • 将内容保存为 .BAT 文件并运行。在我的机器上工作(Windows 8)。
    • 最好在 .CMD 文件中执行,由 CMD.EXE 而不是 COMMAND.COM 解释 ;-) differencebetween.net/technology/difference-between-cmd-and-bat
    • 为什么不把@echo off放在开头而不是在每个命令前加上@
    • 在调试脚本时,为每个命令加上 @ 前缀很有用。如果您怀疑某行运行不正常,只需取消该行的 @ 并重新运行您的脚本。您将在控制台上看到正在发生的事情。
    【解决方案8】:

    试试uuid.bat 没有参数它只会回显生成的uuid:

    c:\>uuid.bat
    
    2186cb38-d649-4c99-b7cc-c505e4dae9c2
    

    如果参数被传递,它将被存储在同名的变量中:

    call uuid.bat my_uuid
    echo %my_uuid%
    

    94772f66-8bca-468e-9e9a-de0d9ee05cc1

    对于 windows 格式的 GUID,您可以使用 guid.bat:

    for /f %a in ('guid.bat') do set guid=%a
    echo %guid%
    

    【讨论】:

      【解决方案9】:

      如果您安装了dotnet

      $ dotnet tool install -g guid
      $ guid
      bf4be9d0-7d1b-485c-a435-d07fd7b892f0
      $ guid help
      Usage:
      
          guid [option]
      
      Where [option] is an optional single character that controls formatting:
      
          N    B382C3F44E604D08B48A2D342A659B4E
          D    B382C3F4-4E60-4D08-B48A-2D342A659B4E
          B    {B382C3F4-4E60-4D08-B48A-2D342A659B4E}
          P    (B382C3F4-4E60-4D08-B48A-2D342A659B4E)
      
      When unspecified, 'd' formatting is used. Use lowercase [option] for lowercase output.
      

      【讨论】:

        【解决方案10】:

        如果系统操作系统没有 Windows SDK 但有一个带有 mingw-w64 工具链的 C 编译器,则编译这个小程序以生成随机 GUID。导入的函数是 UuidCreate (rpcrt4.lib) 来创建随机 UUID 和 StringFromCLSID (ole32.lib) 来将 UUID 转换为宽字符串。

        #include <Windows.h>
        #include <stdio.h>
        
        /*
         * int UuidCreate(GUID *id);
         * int StringFromCLSID(GUID *id, wchar_t **str);
         * Libraries: Rpcrt4.lib Ole32.lib
         */
        
        int main(void)
        {
            GUID id;
            wchar_t *str = NULL;
        
            UuidCreate(&id);
            StringFromCLSID(&id, &str);
            wprintf(L"%ls\n", str);
        }
        

        【讨论】:

          【解决方案11】:

          可能会滥用bitsadmin 来生成 GUID。这将比从批处理脚本调用 PowerShell 快得多。

          @echo off & setlocal
          
          for /f "delims={}" %%I in ('bitsadmin /rawreturn /create guid') do set "GUID=%%~I"
          >NUL bitsadmin /cancel {%GUID%}
          
          echo Your new GUID is %GUID%.  Neat.
          

          如果要保留周围的大括号,请删除 "delims={}" 并将 {%GUID%} 替换为 %GUID%

          【讨论】:

            猜你喜欢
            • 2012-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多